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

Code
Comments
Other
Rev Date Author Line
3176 06 Mar 15 olle 1 var ExtractionReg = function()
3176 06 Mar 15 olle 2 {
3176 06 Mar 15 olle 3   var exreg = {};
3240 10 Apr 15 olle 4   var debug = 0;
3176 06 Mar 15 olle 5   
3176 06 Mar 15 olle 6   exreg.REAGENTS = [
3176 06 Mar 15 olle 7     'xyleneSpecimen', 'etoh995Specimen', 'bufferPkdSpecimen', 'bufferAtlSpecimen',
3176 06 Mar 15 olle 8     'proteinaseKSpecimen', 'rnaseASpecimen', 'allPrepFfpeKit', 'etoh995',
3176 06 Mar 15 olle 9     'bufferRlt', 'bufferFrn', 'bufferRpe', 'bufferAl',
3176 06 Mar 15 olle 10     'bufferAw1', 'bufferAw2', 'bufferAte', 'bufferRdd',
3324 11 May 15 olle 11     'rnaseFreeWater', 'dnaseMix', 'rneasyMinEluteSpinColumn', 'qiaampMinEluteSpinColumn',
3438 03 Jul 15 olle 12     'kapaSybrFast', 'qualityControlPrimersQcpRgt', 'qualityControlTemplateQct', 'qubitDnaHighSens', 'qubitDnaBroadRange'
3176 06 Mar 15 olle 13     ];
3176 06 Mar 15 olle 14
3176 06 Mar 15 olle 15   var MINIMAL_PRE_NORMALIZE_QUANTITY = 1.1; // µg
3283 29 Apr 15 olle 16   var QUBIT_DILUTION_FACTOR_DEFAULT = 200.0;
3176 06 Mar 15 olle 17   var protocolMap = {};
3176 06 Mar 15 olle 18
3180 17 Mar 15 olle 19   var extraItemsList = [];
3352 26 May 15 olle 20   var qiacubeSortedPrefixes = 'BCADEFGHIJKLMNOPQRSTUVWXYZ';
3180 17 Mar 15 olle 21   var qiacubeDateIsAfterIsolationDate = true;
3176 06 Mar 15 olle 22   var qiacubeRunNoIsValid = false;
3176 06 Mar 15 olle 23   var qiacubePositionsAreValid = false;
3176 06 Mar 15 olle 24   var reagentFileIsValid = false;
3176 06 Mar 15 olle 25   var nanoDropFileIsValid = false;
3176 06 Mar 15 olle 26   var qubitFileIsValid = false;
3176 06 Mar 15 olle 27   var qPcrFileIsValid = false;
3176 06 Mar 15 olle 28   var counterBalanceInfoRow = false;
3336 13 May 15 olle 29   var trackingProtocolPreview = true;
3176 06 Mar 15 olle 30   var createdRna = [];
4249 23 Nov 16 olle 31   var rnaVolumeMicroLitersDefault = null;
4249 23 Nov 16 olle 32   var dnaVolumeMicroLitersDefault = null;
3176 06 Mar 15 olle 33   
3176 06 Mar 15 olle 34   // Page initialization
3176 06 Mar 15 olle 35   exreg.initPage = function()
3176 06 Mar 15 olle 36   {
3176 06 Mar 15 olle 37     // Step 1
3176 06 Mar 15 olle 38     Events.addEventHandler('step-1', 'wizard-validate', exreg.validateStep1);
3180 17 Mar 15 olle 39     //Events.addEventHandler('extractSourceItems', 'change', exreg.sourceItemsOnChange);
3176 06 Mar 15 olle 40
3176 06 Mar 15 olle 41     // Step 2
3176 06 Mar 15 olle 42     Events.addEventHandler('step-2', 'wizard-initialize', exreg.initializeStep2);
3176 06 Mar 15 olle 43     Events.addEventHandler('step-2', 'wizard-validate', exreg.validateStep2);
3176 06 Mar 15 olle 44     
3180 17 Mar 15 olle 45     Events.addEventHandler('isolationDate', 'change', Wizard.validateDate);
3176 06 Mar 15 olle 46     Events.addEventHandler('qiacubeDate', 'change', Wizard.validateDate);
3180 17 Mar 15 olle 47     Events.addEventHandler('isolationDate', 'change', exreg.qiacubeDateOnChange);
3176 06 Mar 15 olle 48     Events.addEventHandler('qiacubeDate', 'change', exreg.qiacubeDateOnChange);
3176 06 Mar 15 olle 49     Events.addEventHandler('qiacubeRunNo', 'change', exreg.qiacubeRunNoOnChange);
3176 06 Mar 15 olle 50     Events.addEventHandler('reagentFile', 'change', exreg.reagentFileOnChange);
3176 06 Mar 15 olle 51     
3332 12 May 15 olle 52     Buttons.addClickHandler('downloadReagentLotNoFile', exreg.downloadReagentLotNoFile);
3332 12 May 15 olle 53
3176 06 Mar 15 olle 54     // Step 3
3176 06 Mar 15 olle 55     Events.addEventHandler('step-3', 'wizard-initialize', exreg.initializeStep3);
3176 06 Mar 15 olle 56     Events.addEventHandler('step-3', 'wizard-validate', exreg.validateStep3);
3176 06 Mar 15 olle 57
3176 06 Mar 15 olle 58     Events.addEventHandler('nanoDropFile', 'change', exreg.nanoDropFileOnChange);
3176 06 Mar 15 olle 59     Events.addEventHandler('qubitFile', 'change', exreg.qubitFileOnChange);
3283 29 Apr 15 olle 60     Events.addEventHandler('qubitFileDilutionFactor', 'change', exreg.qubitFileDilutionFactorOnChange);
3176 06 Mar 15 olle 61     Events.addEventHandler('qPcrFile', 'change', exreg.qPcrFileOnChange);
3176 06 Mar 15 olle 62
3176 06 Mar 15 olle 63     Buttons.addClickHandler('btnFakeNanoDropFile', exreg.generateFakeNanoDropFile);    
3176 06 Mar 15 olle 64     Buttons.addClickHandler('btnFakeDnaInput', exreg.generateFakeDnaInput);
3176 06 Mar 15 olle 65     Buttons.addClickHandler('btnFakeQPcrFile', exreg.generateFakeQPcrFile);
3176 06 Mar 15 olle 66     
3176 06 Mar 15 olle 67     // Navigation
3176 06 Mar 15 olle 68     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
3176 06 Mar 15 olle 69     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
3176 06 Mar 15 olle 70     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
3176 06 Mar 15 olle 71     Buttons.addClickHandler('goregister', Wizard.goRegister);
3176 06 Mar 15 olle 72     Buttons.addClickHandler('gocreate', exreg.createProtocol);
3176 06 Mar 15 olle 73     
3176 06 Mar 15 olle 74     // Final registration
3176 06 Mar 15 olle 75     Events.addEventHandler('wizard', 'wizard-submit', exreg.submit);
3176 06 Mar 15 olle 76
4249 23 Nov 16 olle 77     // Load configuration
4249 23 Nov 16 olle 78     exreg.loadConfiguration();
4249 23 Nov 16 olle 79   }
4249 23 Nov 16 olle 80   
4249 23 Nov 16 olle 81   exreg.loadConfiguration = function()
4249 23 Nov 16 olle 82   {
4249 23 Nov 16 olle 83     var url = '../Session.servlet?ID='+App.getSessionId();
4249 23 Nov 16 olle 84     url += '&cmd=GetConfiguration'
4249 23 Nov 16 olle 85     var request = Ajax.getXmlHttpRequest();
4249 23 Nov 16 olle 86     request.open("GET", url, true);
4249 23 Nov 16 olle 87     Ajax.setReadyStateHandler(request, exreg.onConfiguration, exreg.onConfiguration);
4249 23 Nov 16 olle 88     request.send(null);
4249 23 Nov 16 olle 89   }
4249 23 Nov 16 olle 90   
4249 23 Nov 16 olle 91   exreg.onConfiguration = function(request)
4249 23 Nov 16 olle 92   {
4249 23 Nov 16 olle 93     var frm = document.forms['meludi'];  
4249 23 Nov 16 olle 94
4249 23 Nov 16 olle 95     if (debug)
4249 23 Nov 16 olle 96     {
4249 23 Nov 16 olle 97       App.debug(Strings.encodeTags(request.responseText));
4249 23 Nov 16 olle 98     }
4249 23 Nov 16 olle 99     
4249 23 Nov 16 olle 100     var response;
4249 23 Nov 16 olle 101     var error = false;
4249 23 Nov 16 olle 102     try
4249 23 Nov 16 olle 103     {
4249 23 Nov 16 olle 104       response = JSON.parse(request.responseText);
4249 23 Nov 16 olle 105       if (response.status != 'ok')
4249 23 Nov 16 olle 106       {
4249 23 Nov 16 olle 107         error = response.message || response.stacktrace || 'Unexpected error';
4249 23 Nov 16 olle 108       }
4249 23 Nov 16 olle 109     }
4249 23 Nov 16 olle 110     catch (ex)
4249 23 Nov 16 olle 111     {
4249 23 Nov 16 olle 112       error = ex;
4249 23 Nov 16 olle 113     }
4249 23 Nov 16 olle 114     if (error) App.debug(error);
4249 23 Nov 16 olle 115
4249 23 Nov 16 olle 116     // Get configuration result    
4249 23 Nov 16 olle 117     var conf = response.configuration;
4249 23 Nov 16 olle 118
4249 23 Nov 16 olle 119     // Check for RNA volume (µl) default
4249 23 Nov 16 olle 120     rnaVolumeMicroLitersDefault = conf.deparaffinizationRnaVolumeMicroLitersDefault;
4249 23 Nov 16 olle 121
4249 23 Nov 16 olle 122     // Check for DNA volume (µl) default
4249 23 Nov 16 olle 123     dnaVolumeMicroLitersDefault = conf.deparaffinizationDnaVolumeMicroLitersDefault;
4249 23 Nov 16 olle 124
4249 23 Nov 16 olle 125     // Continue with initializing info for extraction registration
3176 06 Mar 15 olle 126     var url = '../Extraction.servlet?ID='+App.getSessionId();
3432 29 Jun 15 olle 127     url += '&cmd=GetUnprocessedStartItemLists';    
3176 06 Mar 15 olle 128     Wizard.showLoadingAnimation('Loading unprocessed items...');
3176 06 Mar 15 olle 129     Wizard.asyncJsonRequest(url, exreg.initializeStep1);
3176 06 Mar 15 olle 130   }
3176 06 Mar 15 olle 131   
3176 06 Mar 15 olle 132   exreg.initializeStep1 = function(response)
3176 06 Mar 15 olle 133   {
3176 06 Mar 15 olle 134     var frm = document.forms['meludi'];
3432 29 Jun 15 olle 135     var itemLists = response.itemLists;
3180 17 Mar 15 olle 136     
3432 29 Jun 15 olle 137     var startList = frm.startList;
3432 29 Jun 15 olle 138     if (itemLists.length > 0)
3180 17 Mar 15 olle 139     {
3432 29 Jun 15 olle 140       for (var i=0; i < itemLists.length; i++)
3180 17 Mar 15 olle 141       {
3432 29 Jun 15 olle 142         var itemList = itemLists[i];
3432 29 Jun 15 olle 143         var name = (i+1) + ': ' + Strings.encodeTags(itemList.name);
3432 29 Jun 15 olle 144         if (itemList.sourceItemNames)
3180 17 Mar 15 olle 145         {
3204 20 Mar 15 olle 146           name += ' -- (';
3432 29 Jun 15 olle 147           name += itemList.numMeludiItems;
3432 29 Jun 15 olle 148           name += ' + ' + itemList.numExtraItems;
3204 20 Mar 15 olle 149           name += ')';
3180 17 Mar 15 olle 150         }
3432 29 Jun 15 olle 151         var selected = i == (itemLists.length - 1);
3432 29 Jun 15 olle 152         var option = new Option(name, itemList.id, selected, selected);
3432 29 Jun 15 olle 153         option.itemList = itemList;
3432 29 Jun 15 olle 154         startList.options[startList.length] = option;
3180 17 Mar 15 olle 155       }
3180 17 Mar 15 olle 156       //exreg.sourceItemsOnChange();
3180 17 Mar 15 olle 157     }
3180 17 Mar 15 olle 158     else
3180 17 Mar 15 olle 159     {
3432 29 Jun 15 olle 160       Wizard.setFatalError('No start lists available for processing.');
3180 17 Mar 15 olle 161       return;
3180 17 Mar 15 olle 162     }
3176 06 Mar 15 olle 163
3176 06 Mar 15 olle 164     Doc.show('step-1');
3176 06 Mar 15 olle 165     Doc.show('gonext');
3176 06 Mar 15 olle 166     Doc.hide('btnFakeNanoDropFile');
3176 06 Mar 15 olle 167     Doc.hide('btnFakeDnaInput');
3176 06 Mar 15 olle 168     Doc.hide('btnFakeQPcrFile');
3180 17 Mar 15 olle 169     Doc.hide('extractSourceItems');
3176 06 Mar 15 olle 170   }
3176 06 Mar 15 olle 171
3176 06 Mar 15 olle 172   exreg.validateStep1 = function(event)
3176 06 Mar 15 olle 173   {
3180 17 Mar 15 olle 174     var frm = document.forms['meludi'];
3432 29 Jun 15 olle 175     var startItemList = null;
3432 29 Jun 15 olle 176     for (var i = 0; i < frm.startList.length; i++)
3180 17 Mar 15 olle 177     {
3432 29 Jun 15 olle 178       if (frm.startList[i].selected)
3180 17 Mar 15 olle 179       {
3432 29 Jun 15 olle 180         startItemList = frm.startList[i];
3180 17 Mar 15 olle 181       }
3180 17 Mar 15 olle 182     }
3432 29 Jun 15 olle 183     if (startItemList == null)
3180 17 Mar 15 olle 184     {
3432 29 Jun 15 olle 185       //alert("exreg.validateStep1(): startItemList == null");
3180 17 Mar 15 olle 186       event.preventDefault();
3180 17 Mar 15 olle 187     }
3432 29 Jun 15 olle 188     //alert("exreg.validateStep1(): startItemList.text = " + startItemList.text + " startItemList.value = " + startItemList.value);
3180 17 Mar 15 olle 189
3180 17 Mar 15 olle 190     var url = '../Extraction.servlet?ID='+App.getSessionId();
3432 29 Jun 15 olle 191     url += '&cmd=GetSourceItemListFromStartItemList';
3432 29 Jun 15 olle 192     url += '&startItemListId='+startItemList.value;
3276 29 Apr 15 olle 193     url += '&includeSpecimenExtracts=true';
3180 17 Mar 15 olle 194     Wizard.asyncJsonRequest(url, exreg.sourceItemListLoaded);
3176 06 Mar 15 olle 195   }
3176 06 Mar 15 olle 196   
3180 17 Mar 15 olle 197   exreg.sourceItemListLoaded = function(response)
3180 17 Mar 15 olle 198   {
3180 17 Mar 15 olle 199     var frm = document.forms['meludi'];
3180 17 Mar 15 olle 200
3432 29 Jun 15 olle 201     var startItemList = response.startitemlist;
3180 17 Mar 15 olle 202     var specimens = response.specimens;
3180 17 Mar 15 olle 203     var rnas = response.rnas;
3180 17 Mar 15 olle 204     var dnas = response.dnas;
3212 27 Mar 15 olle 205     var items = response.items;
3245 14 Apr 15 olle 206     extraItemsList = response.extraitems;
3180 17 Mar 15 olle 207     //alert("exreg.sourceItemListLoaded(): specimens.length = " + specimens.length + " rnas.length = " + rnas.length + " dnas.length = " + dnas.length);
3180 17 Mar 15 olle 208
3432 29 Jun 15 olle 209     if (startItemList)
3180 17 Mar 15 olle 210     {
3432 29 Jun 15 olle 211       frm.startListName.value = startItemList.name;
3432 29 Jun 15 olle 212       frm.startListId.value = startItemList.id;
3432 29 Jun 15 olle 213
3180 17 Mar 15 olle 214       // Extraction parameters
3432 29 Jun 15 olle 215       frm.isolationDate.value = startItemList.isolationDate;
3501 21 Sep 15 olle 216       frm.extractionOperator.value = startItemList.extractionOperator;
3432 29 Jun 15 olle 217       frm.extractionProtocolId.value = startItemList.extractionProtocolId;
3432 29 Jun 15 olle 218       frm.extractionProtocolName.value = startItemList.extractionProtocolName;
3432 29 Jun 15 olle 219       //frm.rnaDefaultVolume.value = startItemList.rnaDefaultVolume;
3432 29 Jun 15 olle 220       //frm.dnaDefaultVolume.value = startItemList.dnaDefaultVolume;
3180 17 Mar 15 olle 221       // QIAcube parameters
3432 29 Jun 15 olle 222       frm.qiacubeDate.value = startItemList.qiacubeDate;
3501 21 Sep 15 olle 223       frm.qiacubeOperator.value = startItemList.qiacubeOperator;
3432 29 Jun 15 olle 224       frm.qiacubePrimaryPrefix.value = startItemList.qiacubePrimaryPrefix;
3432 29 Jun 15 olle 225       frm.qiacubeSecondaryPrefix.value = startItemList.qiacubeSecondaryPrefix;
3432 29 Jun 15 olle 226       frm.qiacubeRunNo.value = startItemList.qiacubeRunNo;
3501 21 Sep 15 olle 227
3501 21 Sep 15 olle 228       // Specimen reagents
3501 21 Sep 15 olle 229       frm.xyleneSpecimen.value = startItemList.xyleneSpecimen;
3501 21 Sep 15 olle 230       frm.etoh995Specimen.value = startItemList.etoh995Specimen;
3432 29 Jun 15 olle 231       frm.allPrepFfpeKit.value = startItemList.allPrepFfpeKit;
3501 21 Sep 15 olle 232       frm.bufferPkdSpecimen.value = startItemList.bufferPkdSpecimen;
3501 21 Sep 15 olle 233       frm.bufferAtlSpecimen.value = startItemList.bufferAtlSpecimen;
3501 21 Sep 15 olle 234       frm.proteinaseKSpecimen.value = startItemList.proteinaseKSpecimen;
3501 21 Sep 15 olle 235       frm.rnaseASpecimen.value = startItemList.rnaseASpecimen;
3180 17 Mar 15 olle 236
3501 21 Sep 15 olle 237       // QIAcube reagents
3501 21 Sep 15 olle 238       frm.etoh995.value = startItemList.etoh995;
3501 21 Sep 15 olle 239       frm.bufferRlt.value = startItemList.bufferRlt;
3501 21 Sep 15 olle 240       frm.bufferFrn.value = startItemList.bufferFrn;
3501 21 Sep 15 olle 241       frm.bufferRpe.value = startItemList.bufferRpe;
3501 21 Sep 15 olle 242       frm.bufferAl.value = startItemList.bufferAl;
3501 21 Sep 15 olle 243       frm.bufferAw1.value = startItemList.bufferAw1;
3501 21 Sep 15 olle 244       frm.bufferAw2.value = startItemList.bufferAw2;
3501 21 Sep 15 olle 245       frm.bufferAte.value = startItemList.bufferAte;
3501 21 Sep 15 olle 246       frm.bufferRdd.value = startItemList.bufferRdd;
3501 21 Sep 15 olle 247       frm.rnaseFreeWater.value = startItemList.rnaseFreeWater;
3501 21 Sep 15 olle 248       frm.dnaseMix.value = startItemList.dnaseMix;
3501 21 Sep 15 olle 249       frm.rneasyMinEluteSpinColumn.value = startItemList.rneasyMinEluteSpinColumn;
3501 21 Sep 15 olle 250       frm.qiaampMinEluteSpinColumn.value = startItemList.qiaampMinEluteSpinColumn;
3501 21 Sep 15 olle 251
3501 21 Sep 15 olle 252       // Quality control reagents
3501 21 Sep 15 olle 253       frm.kapaSybrFast.value = startItemList.kapaSybrFast;
3501 21 Sep 15 olle 254       frm.qualityControlPrimersQcpRgt.value = startItemList.qualityControlPrimersQcpRgt;
3501 21 Sep 15 olle 255       frm.qualityControlTemplateQct.value = startItemList.qualityControlTemplateQct;
3501 21 Sep 15 olle 256       frm.qubitDnaHighSens.value = startItemList.qubitDnaHighSens;
3501 21 Sep 15 olle 257       frm.qubitDnaBroadRange.value = startItemList.qubitDnaBroadRange;
3501 21 Sep 15 olle 258
3432 29 Jun 15 olle 259       frm.startListName.disabled = true;
3180 17 Mar 15 olle 260       frm.isolationDate.disabled = true;
3501 21 Sep 15 olle 261       frm.extractionOperator.disabled = true;
3432 29 Jun 15 olle 262       //frm.rnaDefaultVolume.disabled = true;
3432 29 Jun 15 olle 263       //frm.dnaDefaultVolume.disabled = true;
3432 29 Jun 15 olle 264
3180 17 Mar 15 olle 265       // QIAcube parameters
3501 21 Sep 15 olle 266       //frm.qiacubeDate.disabled = true;
3501 21 Sep 15 olle 267       //frm.qiacubeOperator.disabled = true;
3180 17 Mar 15 olle 268       frm.qiacubePrimaryPrefix.disabled = true;
3180 17 Mar 15 olle 269       frm.qiacubeSecondaryPrefix.disabled = true;
3501 21 Sep 15 olle 270       //frm.qiacubeRunNo.disabled = true;
3437 03 Jul 15 olle 271       //frm.allPrepFfpeKit.disabled = true;
3180 17 Mar 15 olle 272
3432 29 Jun 15 olle 273       //alert("exreg.sourceItemListLoaded(): startList.isolationDate = " + startList.isolationDate);
3501 21 Sep 15 olle 274       //alert("exreg.sourceItemListLoaded(): startList.extractionOperator = " + startList.extractionOperator);
3432 29 Jun 15 olle 275       //alert("exreg.sourceItemListLoaded(): startList.ExtractionProtocolName = " + startList.ExtractionProtocolName);
3432 29 Jun 15 olle 276       //alert("exreg.sourceItemListLoaded(): startList.rnaDefaultVolume = " + startList.rnaDefaultVolume);
3432 29 Jun 15 olle 277       //alert("exreg.sourceItemListLoaded(): startList.dnaDefaultVolume = " + startList.dnaDefaultVolume);
3432 29 Jun 15 olle 278
3432 29 Jun 15 olle 279       //alert("exreg.sourceItemListLoaded(): startList.qiacubeDate = " + startList.qiacubeDate);
3501 21 Sep 15 olle 280       //alert("exreg.sourceItemListLoaded(): startList.qiacubeOperator = " + startList.qiacubeOperator);
3432 29 Jun 15 olle 281       //alert("exreg.sourceItemListLoaded(): startList.qiacubePrimaryPrefix = " + startList.qiacubePrimaryPrefix);
3432 29 Jun 15 olle 282       //alert("exreg.sourceItemListLoaded(): startList.qiacubeSecondaryPrefix = " + startList.qiacubeSecondaryPrefix);
3432 29 Jun 15 olle 283       //alert("exreg.sourceItemListLoaded(): startList.qiacubeRunNo = " + startList.qiacubeRunNo);
3432 29 Jun 15 olle 284       //alert("exreg.sourceItemListLoaded(): startList.allPrepFfpeKit = " + startList.allPrepFfpeKit);
3180 17 Mar 15 olle 285     }
3180 17 Mar 15 olle 286     //alert("exreg.sourceItemListLoaded(): Startplate parameters loaded");
3180 17 Mar 15 olle 287
3180 17 Mar 15 olle 288     var sourceItemList = frm.extractSourceItems;
3212 27 Mar 15 olle 289     if (items.length)
3180 17 Mar 15 olle 290     {
3212 27 Mar 15 olle 291       var numItems = items.length;
3212 27 Mar 15 olle 292       for (var i=0; i < items.length; i++)
3180 17 Mar 15 olle 293       {
3212 27 Mar 15 olle 294         var item = items[i];
3212 27 Mar 15 olle 295         var name = (i+1) + ': ' + Strings.encodeTags(item.name);
3212 27 Mar 15 olle 296         if (item.bioWell)
3180 17 Mar 15 olle 297         {
3212 27 Mar 15 olle 298           name += ' -- ' + Strings.encodeTags(item.bioWell.bioPlate.name + ' (' + item.bioWell.location + ')');
3180 17 Mar 15 olle 299         }
3212 27 Mar 15 olle 300         var selected = i < 24;
3212 27 Mar 15 olle 301         // Identification of item via id works here as specimens and extracts
3212 27 Mar 15 olle 302         // are stored in the same database table using discriminators, and are
3212 27 Mar 15 olle 303         // therefore guaranteed to not have the same id value as another item in the table.
3212 27 Mar 15 olle 304         var option = new Option(name, item.id, selected, selected);
3212 27 Mar 15 olle 305         option.item = item;
3212 27 Mar 15 olle 306         sourceItemList.options[sourceItemList.length] = option;
3180 17 Mar 15 olle 307       }
3180 17 Mar 15 olle 308     }
3180 17 Mar 15 olle 309     else
3180 17 Mar 15 olle 310     {
3180 17 Mar 15 olle 311       Wizard.setFatalError('No items available for processing.');
3180 17 Mar 15 olle 312       return;
3180 17 Mar 15 olle 313     }
3180 17 Mar 15 olle 314     //alert("exreg.sourceItemListLoaded(): End");
3180 17 Mar 15 olle 315   }
3180 17 Mar 15 olle 316   
3176 06 Mar 15 olle 317   exreg.initializeStep2 = function()
3176 06 Mar 15 olle 318   {
3176 06 Mar 15 olle 319     var frm = document.forms['meludi'];
3432 29 Jun 15 olle 320     var startList = null;
3432 29 Jun 15 olle 321     for (var i = 0; i < frm.startList.length; i++)
3180 17 Mar 15 olle 322     {
3432 29 Jun 15 olle 323       if (frm.startList[i].selected)
3180 17 Mar 15 olle 324       {
3432 29 Jun 15 olle 325         startList = frm.startList[i];
3180 17 Mar 15 olle 326       }
3180 17 Mar 15 olle 327     }
3432 29 Jun 15 olle 328     if (startList == null)
3180 17 Mar 15 olle 329     {
3432 29 Jun 15 olle 330       //alert("exreg.validateStep1(): startList == null");
3180 17 Mar 15 olle 331       event.preventDefault();
3180 17 Mar 15 olle 332     }
3180 17 Mar 15 olle 333
3432 29 Jun 15 olle 334     frm.startList.disabled = true;
4249 23 Nov 16 olle 335     frm.rnaDefaultVolume.value = rnaVolumeMicroLitersDefault;
4249 23 Nov 16 olle 336     frm.dnaDefaultVolume.value = dnaVolumeMicroLitersDefault;
3183 18 Mar 15 olle 337
3183 18 Mar 15 olle 338     var clearButtons = Doc.element('commonInfoSection').getElementsByClassName('clear-reagents');
3183 18 Mar 15 olle 339     if (clearButtons.length > 0)
3183 18 Mar 15 olle 340     {
3183 18 Mar 15 olle 341       Buttons.addClickHandler(clearButtons[0], exreg.clearReagents);
3183 18 Mar 15 olle 342     }
3183 18 Mar 15 olle 343     var copyButtons = Doc.element('commonInfoSection').getElementsByClassName('copy-reagents-from-latest-extract');
3183 18 Mar 15 olle 344     if (copyButtons.length > 0)
3183 18 Mar 15 olle 345     {
3183 18 Mar 15 olle 346       Buttons.addClickHandler(copyButtons[0], exreg.copyReagentsFromLatestExtract);
3183 18 Mar 15 olle 347     }
3183 18 Mar 15 olle 348
3176 06 Mar 15 olle 349     Wizard.setCurrentStep(2);
3176 06 Mar 15 olle 350     Doc.show('gocancel');
3176 06 Mar 15 olle 351     Doc.show('gonext');
3176 06 Mar 15 olle 352     Doc.hide('btnFakeNanoDropFile');
3176 06 Mar 15 olle 353     Doc.hide('btnFakeDnaInput');
3176 06 Mar 15 olle 354     Doc.hide('btnFakeQPcrFile');
3432 29 Jun 15 olle 355     Doc.hide('startListId');
3180 17 Mar 15 olle 356     Doc.hide('extractionProtocolId');
3176 06 Mar 15 olle 357
3180 17 Mar 15 olle 358 /*
3176 06 Mar 15 olle 359     Meludi.loadProtocols('SAMPLE_HANDLING_PROTOCOL', 'extractionProtocol');
3176 06 Mar 15 olle 360     Doc.addClass('extractionProtocol', 'list-loading');
3176 06 Mar 15 olle 361     frm.extractionProtocol[0] = new Option('loading...', '');
3176 06 Mar 15 olle 362     var url = '../Protocol.servlet?ID='+App.getSessionId();
3176 06 Mar 15 olle 363     url += '&cmd=GetProtocols&subtype=EXTRACTION_PROTOCOL';
3176 06 Mar 15 olle 364     Wizard.asyncJsonRequest(url, exreg.protocolsLoaded);
3180 17 Mar 15 olle 365 */
3176 06 Mar 15 olle 366
3180 17 Mar 15 olle 367     frm.isolationDate.focus();
3180 17 Mar 15 olle 368     Events.sendChangeEvent('isolationDate');
3176 06 Mar 15 olle 369     Events.sendChangeEvent('qiacubeDate');
3176 06 Mar 15 olle 370   }
3180 17 Mar 15 olle 371
3180 17 Mar 15 olle 372 /*  
3176 06 Mar 15 olle 373   exreg.protocolsLoaded = function(response)
3176 06 Mar 15 olle 374   {
3176 06 Mar 15 olle 375     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 376     var protocols = response.protocols;
3176 06 Mar 15 olle 377
3176 06 Mar 15 olle 378     Doc.removeClass('extractionProtocol', 'list-loading');
3176 06 Mar 15 olle 379     frm.extractionProtocol.length = 0;
3176 06 Mar 15 olle 380     for (var i = 0; i < protocols.length; i++)
3176 06 Mar 15 olle 381     {
3176 06 Mar 15 olle 382       var name = protocols[i].name;
3176 06 Mar 15 olle 383       var id = protocols[i].id;
3176 06 Mar 15 olle 384       protocolMap[id] = name;
3202 19 Mar 15 olle 385       frm.extractionProtocol[frm.extractionProtocol.length] = new Option(name, id, false, true);
3176 06 Mar 15 olle 386     }
3176 06 Mar 15 olle 387     frm.extractionProtocol[frm.extractionProtocol.length] = new Option('- none -', '');
3176 06 Mar 15 olle 388
3176 06 Mar 15 olle 389     var url = '../Extraction.servlet?ID='+App.getSessionId();
3176 06 Mar 15 olle 390     url += '&cmd=GetLastProcessedDna';
3176 06 Mar 15 olle 391     Wizard.asyncJsonRequest(url, exreg.lastProcessedDnaLoaded);
3176 06 Mar 15 olle 392   }
3180 17 Mar 15 olle 393 */
3180 17 Mar 15 olle 394
3183 18 Mar 15 olle 395   exreg.clearReagents = function()
3183 18 Mar 15 olle 396   {
3183 18 Mar 15 olle 397     var frm = document.forms['meludi'];
3183 18 Mar 15 olle 398
3183 18 Mar 15 olle 399     // Clear reagent values
3183 18 Mar 15 olle 400
3183 18 Mar 15 olle 401     // Specimen reagents
3183 18 Mar 15 olle 402     frm.xyleneSpecimen.value = null;
3183 18 Mar 15 olle 403     frm.etoh995Specimen.value = null;
3183 18 Mar 15 olle 404     frm.bufferPkdSpecimen.value = null;
3183 18 Mar 15 olle 405     frm.bufferAtlSpecimen.value = null;
3183 18 Mar 15 olle 406     frm.proteinaseKSpecimen.value = null;
3183 18 Mar 15 olle 407     frm.rnaseASpecimen.value = null;
3183 18 Mar 15 olle 408
3183 18 Mar 15 olle 409     // QIAcube reagents
3183 18 Mar 15 olle 410     frm.etoh995.value = null;
3183 18 Mar 15 olle 411     frm.bufferRlt.value = null;
3183 18 Mar 15 olle 412     frm.bufferFrn.value = null;
3183 18 Mar 15 olle 413     frm.bufferRpe.value = null;
3183 18 Mar 15 olle 414     frm.bufferAl.value = null;
3183 18 Mar 15 olle 415     frm.bufferAw1.value = null;
3183 18 Mar 15 olle 416     frm.bufferAw2.value = null;
3183 18 Mar 15 olle 417     frm.bufferAte.value = null;
3183 18 Mar 15 olle 418     frm.bufferRdd.value = null;
3183 18 Mar 15 olle 419     frm.rnaseFreeWater.value = null;
3183 18 Mar 15 olle 420     frm.dnaseMix.value = null;
3183 18 Mar 15 olle 421     frm.rneasyMinEluteSpinColumn.value = null;
3183 18 Mar 15 olle 422     frm.qiaampMinEluteSpinColumn.value = null;
3324 11 May 15 olle 423
3324 11 May 15 olle 424     // Quality control reagents
3324 11 May 15 olle 425     frm.kapaSybrFast.value = null;
3324 11 May 15 olle 426     frm.qualityControlPrimersQcpRgt.value = null;
3438 03 Jul 15 olle 427     frm.qualityControlTemplateQct.value = null;
3324 11 May 15 olle 428     frm.qubitDnaHighSens.value = null;
3324 11 May 15 olle 429     frm.qubitDnaBroadRange.value = null;
3183 18 Mar 15 olle 430   }
3183 18 Mar 15 olle 431
3183 18 Mar 15 olle 432   exreg.copyReagentsFromLatestExtract = function()
3183 18 Mar 15 olle 433   {
3183 18 Mar 15 olle 434     var url = '../Extraction.servlet?ID='+App.getSessionId();
3183 18 Mar 15 olle 435     url += '&cmd=GetLastProcessedDna';
3183 18 Mar 15 olle 436     Wizard.asyncJsonRequest(url, exreg.lastProcessedDnaLoaded);
3183 18 Mar 15 olle 437   }
3183 18 Mar 15 olle 438
3176 06 Mar 15 olle 439   exreg.lastProcessedDnaLoaded = function(response)
3176 06 Mar 15 olle 440   {
3176 06 Mar 15 olle 441     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 442     var dnas = response.dnas;
3176 06 Mar 15 olle 443
3176 06 Mar 15 olle 444     if (dnas.length > 0)
3176 06 Mar 15 olle 445     {
3183 18 Mar 15 olle 446       var dna = dnas[0];
3176 06 Mar 15 olle 447
3183 18 Mar 15 olle 448       // Reset the existing values
3176 06 Mar 15 olle 449
3183 18 Mar 15 olle 450       // AllPrep FFPE Kit      
3183 18 Mar 15 olle 451       var allPrepFfpeKit = '';
3183 18 Mar 15 olle 452
3183 18 Mar 15 olle 453       // Specimen reagents
3183 18 Mar 15 olle 454       var specXylene = '';
3183 18 Mar 15 olle 455       var specEtoh995 = '';
3183 18 Mar 15 olle 456       var specBufferPkd = '';
3183 18 Mar 15 olle 457       var specBufferAtl = '';
3183 18 Mar 15 olle 458       var specProteinaseK = '';
3183 18 Mar 15 olle 459       var specRNAseA = '';
3183 18 Mar 15 olle 460
3183 18 Mar 15 olle 461       // QIAcube reagents
3183 18 Mar 15 olle 462       var bufferRlt = '';
3183 18 Mar 15 olle 463       var etoh995 = '';
3183 18 Mar 15 olle 464       var bufferFrn = '';
3183 18 Mar 15 olle 465       var bufferRpe = '';
3183 18 Mar 15 olle 466       var rnaseFreeWater = '';
3183 18 Mar 15 olle 467       var dnaseMix = '';
3183 18 Mar 15 olle 468       var bufferRdd = '';
3183 18 Mar 15 olle 469       var rneasyMinEluteSpinColumn = '';
3183 18 Mar 15 olle 470       var bufferAl = '';
3183 18 Mar 15 olle 471       var bufferAW1 = '';
3183 18 Mar 15 olle 472       var bufferAW2 = '';
3183 18 Mar 15 olle 473       var bufferAte = '';
3183 18 Mar 15 olle 474       var qiaampMinEluteSpinColumn = '';
3183 18 Mar 15 olle 475
3324 11 May 15 olle 476       // Quality control reagents
3324 11 May 15 olle 477       var kapaSybrFast = '';
3324 11 May 15 olle 478       var qualityControlPrimersQcpRgt = '';
3438 03 Jul 15 olle 479       var qualityControlTemplateQct = '';
3324 11 May 15 olle 480       var qubitDnaHighSens = '';
3324 11 May 15 olle 481       var qubitDnaBroadRange = '';
3324 11 May 15 olle 482
3183 18 Mar 15 olle 483       if (dna) 
3183 18 Mar 15 olle 484       {
3176 06 Mar 15 olle 485         // AllPrep FFPE Kit      
3183 18 Mar 15 olle 486         allPrepFfpeKit = dna.allPrepFfpeKit;
3176 06 Mar 15 olle 487
3176 06 Mar 15 olle 488         // Specimen reagents
3183 18 Mar 15 olle 489         specXylene = dna.xyleneSpecimen;
3183 18 Mar 15 olle 490         specEtoh995 = dna.etoh995Specimen;
3183 18 Mar 15 olle 491         specBufferPkd = dna.bufferPkdSpecimen;
3183 18 Mar 15 olle 492         specBufferAtl = dna.bufferAtlSpecimen;
3183 18 Mar 15 olle 493         specProteinaseK = dna.proteinaseKSpecimen;
3183 18 Mar 15 olle 494         specRNAseA = dna.rnaseASpecimen;
3176 06 Mar 15 olle 495
3176 06 Mar 15 olle 496         // QIAcube reagents
3183 18 Mar 15 olle 497         bufferRlt = dna.bufferRlt;
3183 18 Mar 15 olle 498         etoh995 = dna.etoh995;
3183 18 Mar 15 olle 499         bufferFrn = dna.bufferFrn;
3183 18 Mar 15 olle 500         bufferRpe = dna.bufferRpe;
3183 18 Mar 15 olle 501         rnaseFreeWater = dna.rnaseFreeWater;
3183 18 Mar 15 olle 502         dnaseMix = dna.dnaseMix;
3183 18 Mar 15 olle 503         bufferRdd = dna.bufferRdd;
3183 18 Mar 15 olle 504         rneasyMinEluteSpinColumn = dna.rneasyMinEluteSpinColumn;
3183 18 Mar 15 olle 505         bufferAl = dna.bufferAl;
3183 18 Mar 15 olle 506         bufferAW1 = dna.bufferAw1;
3183 18 Mar 15 olle 507         bufferAW2 = dna.bufferAw2;
3183 18 Mar 15 olle 508         bufferAte = dna.bufferAte;
3324 11 May 15 olle 509         qiaampMinEluteSpinColumn = dna.qiaampMinEluteSpinColumn;
3324 11 May 15 olle 510
3324 11 May 15 olle 511         // Quality control reagents
3324 11 May 15 olle 512         kapaSybrFast = dna.kapaSybrFast;
3324 11 May 15 olle 513         qualityControlPrimersQcpRgt = dna.qualityControlPrimersQcpRgt;
3438 03 Jul 15 olle 514         qualityControlTemplateQct = dna.qualityControlTemplateQct;
3324 11 May 15 olle 515         qubitDnaHighSens = dna.qubitDnaHighSens;
3324 11 May 15 olle 516         qubitDnaBroadRange = dna.qubitDnaBroadRange;
3183 18 Mar 15 olle 517       }
3176 06 Mar 15 olle 518
3183 18 Mar 15 olle 519       // Update reagent values
3176 06 Mar 15 olle 520
3183 18 Mar 15 olle 521       // Specimen reagents
3183 18 Mar 15 olle 522       frm.xyleneSpecimen.value = specXylene;
3183 18 Mar 15 olle 523       frm.etoh995Specimen.value = specEtoh995;
3501 21 Sep 15 olle 524       frm.allPrepFfpeKit.value = allPrepFfpeKit;
3183 18 Mar 15 olle 525       frm.bufferPkdSpecimen.value = specBufferPkd;
3183 18 Mar 15 olle 526       frm.bufferAtlSpecimen.value = specBufferAtl;
3183 18 Mar 15 olle 527       frm.proteinaseKSpecimen.value = specProteinaseK;
3183 18 Mar 15 olle 528       frm.rnaseASpecimen.value = specRNAseA;
3176 06 Mar 15 olle 529
3183 18 Mar 15 olle 530       // QIAcube reagents
3183 18 Mar 15 olle 531       frm.etoh995.value = etoh995;
3183 18 Mar 15 olle 532       frm.bufferRlt.value = bufferRlt;
3183 18 Mar 15 olle 533       frm.bufferFrn.value = bufferFrn;
3183 18 Mar 15 olle 534       frm.bufferRpe.value = bufferRpe;
3183 18 Mar 15 olle 535       frm.bufferAl.value = bufferAl;
3183 18 Mar 15 olle 536       frm.bufferAw1.value = bufferAW1;
3183 18 Mar 15 olle 537       frm.bufferAw2.value = bufferAW2;
3183 18 Mar 15 olle 538       frm.bufferAte.value = bufferAte;
3183 18 Mar 15 olle 539       frm.bufferRdd.value = bufferRdd;
3183 18 Mar 15 olle 540       frm.rnaseFreeWater.value = rnaseFreeWater;
3183 18 Mar 15 olle 541       frm.dnaseMix.value = dnaseMix;
3183 18 Mar 15 olle 542       frm.rneasyMinEluteSpinColumn.value = rneasyMinEluteSpinColumn;
3183 18 Mar 15 olle 543       frm.qiaampMinEluteSpinColumn.value = qiaampMinEluteSpinColumn;
3324 11 May 15 olle 544
3324 11 May 15 olle 545       // Quality control reagents
3324 11 May 15 olle 546       frm.kapaSybrFast.value = kapaSybrFast;
3324 11 May 15 olle 547       frm.qualityControlPrimersQcpRgt.value = qualityControlPrimersQcpRgt;
3438 03 Jul 15 olle 548       frm.qualityControlTemplateQct.value = qualityControlTemplateQct;
3324 11 May 15 olle 549       frm.qubitDnaHighSens.value = qubitDnaHighSens;
3324 11 May 15 olle 550       frm.qubitDnaBroadRange.value = qubitDnaBroadRange;
3176 06 Mar 15 olle 551     }
3176 06 Mar 15 olle 552   }
3176 06 Mar 15 olle 553
3176 06 Mar 15 olle 554   exreg.qiacubeDateOnChange = function()
3176 06 Mar 15 olle 555   {
3176 06 Mar 15 olle 556     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 557     
3180 17 Mar 15 olle 558     var isolationDateIsValid = Wizard.isValid('isolationDate');
3176 06 Mar 15 olle 559     var qiacubeDateIsValid = Wizard.isValid('qiacubeDate');
3176 06 Mar 15 olle 560     
3180 17 Mar 15 olle 561     if (!isolationDateIsValid || !qiacubeDateIsValid) return;
3176 06 Mar 15 olle 562
3180 17 Mar 15 olle 563     var isolationDate = Dates.parseString(frm.isolationDate.value, 'yyyyMMdd');
3176 06 Mar 15 olle 564     var qiacubeDate = Dates.parseString(frm.qiacubeDate.value, 'yyyyMMdd');
3180 17 Mar 15 olle 565     if (isolationDate > qiacubeDate)
3176 06 Mar 15 olle 566     {
3180 17 Mar 15 olle 567       Wizard.setInputStatus('qiacubeDate', 'invalid', 'QIAcube date is before isolation date');
3180 17 Mar 15 olle 568       qiacubeDateIsAfterIsolationDate = false;
3176 06 Mar 15 olle 569       return;
3176 06 Mar 15 olle 570     }
3176 06 Mar 15 olle 571
3180 17 Mar 15 olle 572     qiacubeDateIsAfterIsolationDate = true;
3176 06 Mar 15 olle 573     
3176 06 Mar 15 olle 574     Wizard.setInputStatus('qiacubeDate', 'valid');
3176 06 Mar 15 olle 575     var url = '../Extraction.servlet?ID='+App.getSessionId();
3176 06 Mar 15 olle 576     url += '&cmd=GetNextQiacubeRunNo&qiacubeDate='+encodeURIComponent(frm.qiacubeDate.value);
3176 06 Mar 15 olle 577     Wizard.showLoadingAnimation('Loading Qiacube run number...');
3176 06 Mar 15 olle 578     Wizard.asyncJsonRequest(url, exreg.gotNextRunNumber);
3176 06 Mar 15 olle 579   }
3176 06 Mar 15 olle 580
3176 06 Mar 15 olle 581   exreg.gotNextRunNumber = function(response)
3176 06 Mar 15 olle 582   {
3176 06 Mar 15 olle 583     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 584     frm.qiacubeRunNo.value = response.nextQiacubeRunNo;
3176 06 Mar 15 olle 585     Events.sendChangeEvent('qiacubeRunNo');
3176 06 Mar 15 olle 586   }
3176 06 Mar 15 olle 587
3176 06 Mar 15 olle 588   exreg.qiacubeRunNoOnChange = function()
3176 06 Mar 15 olle 589   {
3176 06 Mar 15 olle 590     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 591     var runNumber = frm.qiacubeRunNo.value;
3176 06 Mar 15 olle 592     qiacubeRunNoIsValid = false;
3176 06 Mar 15 olle 593
3176 06 Mar 15 olle 594     if (runNumber == '')
3176 06 Mar 15 olle 595     {
3176 06 Mar 15 olle 596       Wizard.setInputStatus('qiacubeRunNo', 'invalid', 'Missing');
3176 06 Mar 15 olle 597       return;
3176 06 Mar 15 olle 598     }
3176 06 Mar 15 olle 599     if (!(parseInt(runNumber, 10) >= 1))
3176 06 Mar 15 olle 600     {
3176 06 Mar 15 olle 601       Wizard.setInputStatus('qiacubeRunNo', 'invalid', 'Must be at least 1');
3176 06 Mar 15 olle 602       return;    
3176 06 Mar 15 olle 603     }
3176 06 Mar 15 olle 604     
3176 06 Mar 15 olle 605     Wizard.setInputStatus('qiacubeRunNo', 'valid');
3176 06 Mar 15 olle 606     qiacubeRunNoIsValid = true;
3176 06 Mar 15 olle 607   }
3176 06 Mar 15 olle 608
3176 06 Mar 15 olle 609   
3176 06 Mar 15 olle 610   exreg.reagentFileOnChange = function()
3176 06 Mar 15 olle 611   {
3176 06 Mar 15 olle 612     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 613     var file = frm.reagentFile.files[0];
3176 06 Mar 15 olle 614     
3176 06 Mar 15 olle 615     var reader = new FileReader();
3176 06 Mar 15 olle 616     reader.onload = exreg.reagentFileLoaded;
3176 06 Mar 15 olle 617     reader.readAsText(file);
3176 06 Mar 15 olle 618   }
3176 06 Mar 15 olle 619
3176 06 Mar 15 olle 620   exreg.reagentFileLoaded = function(event)
3176 06 Mar 15 olle 621   {
3176 06 Mar 15 olle 622     exreg.parseReagentFile(event.target.result);
3176 06 Mar 15 olle 623   }
3176 06 Mar 15 olle 624
3176 06 Mar 15 olle 625   exreg.parseReagentFile = function(data)
3176 06 Mar 15 olle 626   {
3176 06 Mar 15 olle 627     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 628     reagentFileIsValid = false;
3176 06 Mar 15 olle 629
3176 06 Mar 15 olle 630     var numReagentItems = 0;
3176 06 Mar 15 olle 631     // Reset the existing values
3176 06 Mar 15 olle 632
3176 06 Mar 15 olle 633     // AllPrep FFPE Kit      
3176 06 Mar 15 olle 634     var allPrepFfpeKit = '';
3176 06 Mar 15 olle 635
3176 06 Mar 15 olle 636     // Specimen reagents
3176 06 Mar 15 olle 637     var specXylene = '';
3176 06 Mar 15 olle 638     var specEtoh995 = '';
3176 06 Mar 15 olle 639     var specBufferPkd = '';
3176 06 Mar 15 olle 640     var specBufferAtl = '';
3176 06 Mar 15 olle 641     var specProteinaseK = '';
3176 06 Mar 15 olle 642     var specRNAseA = '';
3176 06 Mar 15 olle 643
3176 06 Mar 15 olle 644     // QIAcube reagents
3176 06 Mar 15 olle 645     var bufferRlt = '';
3176 06 Mar 15 olle 646     var etoh995 = '';
3176 06 Mar 15 olle 647     var bufferFrn = '';
3176 06 Mar 15 olle 648     var bufferRpe = '';
3176 06 Mar 15 olle 649     var rnaseFreeWater = '';
3176 06 Mar 15 olle 650     var dnaseMix = '';
3176 06 Mar 15 olle 651     var bufferRdd = '';
3176 06 Mar 15 olle 652     var rneasyMinEluteSpinColumn = '';
3176 06 Mar 15 olle 653     var bufferAl = '';
3176 06 Mar 15 olle 654     var bufferAW1 = '';
3176 06 Mar 15 olle 655     var bufferAW2 = '';
3176 06 Mar 15 olle 656     var bufferAte = '';
3176 06 Mar 15 olle 657     var qiaampMinEluteSpinColumn = '';
3176 06 Mar 15 olle 658
3324 11 May 15 olle 659     // Quality control reagents
3324 11 May 15 olle 660     var kapaSybrFast = '';
3324 11 May 15 olle 661     var qualityControlPrimersQcpRgt = '';
3438 03 Jul 15 olle 662     var qualityControlTemplateQct = '';
3324 11 May 15 olle 663     var qubitDnaHighSens = '';
3324 11 May 15 olle 664     var qubitDnaBroadRange = '';
3324 11 May 15 olle 665
3176 06 Mar 15 olle 666     // Find column separator as first character after first occurrence of search string
3352 26 May 15 olle 667     var separator = ExtractUtils.findSeparator(data, "Specimen Reagents");
3176 06 Mar 15 olle 668     if (separator == null)
3176 06 Mar 15 olle 669     {
3176 06 Mar 15 olle 670       // Comma is default separator
3176 06 Mar 15 olle 671       separator = ',';
3176 06 Mar 15 olle 672     }
3176 06 Mar 15 olle 673     var columnSplitRegexp = new RegExp(" *" + separator + " *",'');
3176 06 Mar 15 olle 674     var lines = data.split(/[\n\r]+/);
3176 06 Mar 15 olle 675     var columns = lines[0].split(columnSplitRegexp);
3176 06 Mar 15 olle 676
3176 06 Mar 15 olle 677     var numImported = 0;
3176 06 Mar 15 olle 678     var inQiaCubeSection = false;
3176 06 Mar 15 olle 679     for (var i = 1; i < lines.length; i++)
3176 06 Mar 15 olle 680     {
3176 06 Mar 15 olle 681       if (lines[i].match(/^\s*$/)) continue; // Ignore empty lines
3176 06 Mar 15 olle 682       var row = lines[i].split(columnSplitRegexp);
3176 06 Mar 15 olle 683       if (row[0] == 'Qiacube Reagents')
3176 06 Mar 15 olle 684       {
3176 06 Mar 15 olle 685         inQiaCubeSection = true;
3176 06 Mar 15 olle 686       }
3176 06 Mar 15 olle 687       if (row.length > 1) 
3176 06 Mar 15 olle 688       {
3176 06 Mar 15 olle 689         var key = row[0];
3176 06 Mar 15 olle 690         if (!key || key == '') continue; // with the next line
3176 06 Mar 15 olle 691
3176 06 Mar 15 olle 692         // AllPrep FFPE Kit      
3501 21 Sep 15 olle 693         if (key == 'AllPrep DNA/RNA FFPE kit')
3176 06 Mar 15 olle 694         {
3176 06 Mar 15 olle 695           allPrepFfpeKit = row[1];
3176 06 Mar 15 olle 696         }
3176 06 Mar 15 olle 697
3176 06 Mar 15 olle 698         // Specimen reagents
3176 06 Mar 15 olle 699         if (key == 'Xylen')
3176 06 Mar 15 olle 700         {
3176 06 Mar 15 olle 701           specXylene = row[1];
3176 06 Mar 15 olle 702         }
3176 06 Mar 15 olle 703         if (key == 'ETOH 99,5%')
3176 06 Mar 15 olle 704         {
3176 06 Mar 15 olle 705           if (!inQiaCubeSection)
3176 06 Mar 15 olle 706           {
3176 06 Mar 15 olle 707             specEtoh995 = row[1];
3176 06 Mar 15 olle 708           }
3176 06 Mar 15 olle 709         }
3176 06 Mar 15 olle 710         if (key == 'Buffer PKD')
3176 06 Mar 15 olle 711         {
3176 06 Mar 15 olle 712           specBufferPkd = row[1];
3176 06 Mar 15 olle 713         }
3176 06 Mar 15 olle 714         if (key == 'Buffer ATL')
3176 06 Mar 15 olle 715         {
3176 06 Mar 15 olle 716           specBufferAtl = row[1];
3176 06 Mar 15 olle 717         }
3176 06 Mar 15 olle 718         if (key == 'Proteinase K')
3176 06 Mar 15 olle 719         {
3176 06 Mar 15 olle 720           specProteinaseK = row[1];
3176 06 Mar 15 olle 721         }
3176 06 Mar 15 olle 722         if (key == 'Rnase A')
3176 06 Mar 15 olle 723         {
3176 06 Mar 15 olle 724           specRNAseA = row[1];
3176 06 Mar 15 olle 725         }
3176 06 Mar 15 olle 726
3176 06 Mar 15 olle 727         // QIAcube reagents
3176 06 Mar 15 olle 728         if (key == 'Buffer RLT')
3176 06 Mar 15 olle 729         {
3176 06 Mar 15 olle 730           bufferRlt = row[1];
3176 06 Mar 15 olle 731         }
3176 06 Mar 15 olle 732         if (key == 'ETOH 99,5%')
3176 06 Mar 15 olle 733         {
3176 06 Mar 15 olle 734           if (inQiaCubeSection)
3176 06 Mar 15 olle 735           {
3176 06 Mar 15 olle 736             etoh995 = row[1];
3176 06 Mar 15 olle 737           }
3176 06 Mar 15 olle 738         }
3176 06 Mar 15 olle 739         if (key == 'Buffer FRN')
3176 06 Mar 15 olle 740         {
3176 06 Mar 15 olle 741           bufferFrn = row[1];
3176 06 Mar 15 olle 742         }
3176 06 Mar 15 olle 743         if (key == 'Buffer RPE')
3176 06 Mar 15 olle 744         {
3176 06 Mar 15 olle 745           bufferRpe = row[1];
3176 06 Mar 15 olle 746         }
3176 06 Mar 15 olle 747         if (key == 'Rnase-free Water')
3176 06 Mar 15 olle 748         {
3176 06 Mar 15 olle 749           rnaseFreeWater = row[1];
3176 06 Mar 15 olle 750         }
3176 06 Mar 15 olle 751         if (key == 'DNAse mix')
3176 06 Mar 15 olle 752         {
3176 06 Mar 15 olle 753           dnaseMix = row[1];
3176 06 Mar 15 olle 754         }
3176 06 Mar 15 olle 755         if (key == 'RDD')
3176 06 Mar 15 olle 756         {
3176 06 Mar 15 olle 757           bufferRdd = row[1];
3176 06 Mar 15 olle 758         }
3176 06 Mar 15 olle 759         if (key == 'Rneasy MinElute Spin Column')
3176 06 Mar 15 olle 760         {
3176 06 Mar 15 olle 761           rneasyMinEluteSpinColumn = row[1];
3176 06 Mar 15 olle 762         }
3176 06 Mar 15 olle 763         if (key == 'Buffer AL')
3176 06 Mar 15 olle 764         {
3176 06 Mar 15 olle 765           bufferAl = row[1];
3176 06 Mar 15 olle 766         }
3176 06 Mar 15 olle 767         if (key == 'Buffer AW1')
3176 06 Mar 15 olle 768         {
3176 06 Mar 15 olle 769           bufferAW1 = row[1];
3176 06 Mar 15 olle 770         }
3176 06 Mar 15 olle 771         if (key == 'Buffer AW2')
3176 06 Mar 15 olle 772         {
3176 06 Mar 15 olle 773           bufferAW2 = row[1];
3176 06 Mar 15 olle 774         }
3176 06 Mar 15 olle 775         if (key == 'Buffer ATE')
3176 06 Mar 15 olle 776         {
3176 06 Mar 15 olle 777           bufferAte = row[1];
3176 06 Mar 15 olle 778         }
3176 06 Mar 15 olle 779         if (key == 'QIAamp MinElute Spin Column')
3176 06 Mar 15 olle 780         {
3176 06 Mar 15 olle 781           qiaampMinEluteSpinColumn = row[1];
3176 06 Mar 15 olle 782         }
3324 11 May 15 olle 783
3324 11 May 15 olle 784         // Quality control reagents
3324 11 May 15 olle 785         if (key == 'Kapa SYBR Fast')
3324 11 May 15 olle 786         {
3324 11 May 15 olle 787           kapaSybrFast = row[1];
3324 11 May 15 olle 788         }
3324 11 May 15 olle 789         if (key == 'Quality Control Primers (QCP) RGT')
3324 11 May 15 olle 790         {
3324 11 May 15 olle 791           qualityControlPrimersQcpRgt = row[1];
3324 11 May 15 olle 792         }
3438 03 Jul 15 olle 793         if (key == 'Quality Control Template (QCT)')
3438 03 Jul 15 olle 794         {
3438 03 Jul 15 olle 795           qualityControlTemplateQct = row[1];
3438 03 Jul 15 olle 796         }
3324 11 May 15 olle 797         if (key == 'QUBIT DNA High Sens')
3324 11 May 15 olle 798         {
3324 11 May 15 olle 799           qubitDnaHighSens = row[1];
3324 11 May 15 olle 800         }
3324 11 May 15 olle 801         if (key == 'QUBIT DNA Broad Range')
3324 11 May 15 olle 802         {
3324 11 May 15 olle 803           qubitDnaBroadRange = row[1];
3324 11 May 15 olle 804         }
3176 06 Mar 15 olle 805       }
3176 06 Mar 15 olle 806     }
3176 06 Mar 15 olle 807
3176 06 Mar 15 olle 808     // Update reagent values
3176 06 Mar 15 olle 809
3176 06 Mar 15 olle 810     // Specimen reagents
3176 06 Mar 15 olle 811     frm.xyleneSpecimen.value = specXylene;
3176 06 Mar 15 olle 812     frm.etoh995Specimen.value = specEtoh995;
3501 21 Sep 15 olle 813     frm.allPrepFfpeKit.value = allPrepFfpeKit;
3176 06 Mar 15 olle 814     frm.bufferPkdSpecimen.value = specBufferPkd;
3176 06 Mar 15 olle 815     frm.bufferAtlSpecimen.value = specBufferAtl;
3176 06 Mar 15 olle 816     frm.proteinaseKSpecimen.value = specProteinaseK;
3176 06 Mar 15 olle 817     frm.rnaseASpecimen.value = specRNAseA;
3176 06 Mar 15 olle 818
3176 06 Mar 15 olle 819     // QIAcube reagents
3176 06 Mar 15 olle 820     frm.etoh995.value = etoh995;
3176 06 Mar 15 olle 821     frm.bufferRlt.value = bufferRlt;
3176 06 Mar 15 olle 822     frm.bufferFrn.value = bufferFrn;
3176 06 Mar 15 olle 823     frm.bufferRpe.value = bufferRpe;
3501 21 Sep 15 olle 824     frm.rnaseFreeWater.value = rnaseFreeWater;
3501 21 Sep 15 olle 825     frm.dnaseMix.value = dnaseMix;
3501 21 Sep 15 olle 826     frm.bufferRdd.value = bufferRdd;
3501 21 Sep 15 olle 827     frm.rneasyMinEluteSpinColumn.value = rneasyMinEluteSpinColumn;
3501 21 Sep 15 olle 828     frm.qiaampMinEluteSpinColumn.value = qiaampMinEluteSpinColumn;
3176 06 Mar 15 olle 829     frm.bufferAl.value = bufferAl;
3176 06 Mar 15 olle 830     frm.bufferAw1.value = bufferAW1;
3176 06 Mar 15 olle 831     frm.bufferAw2.value = bufferAW2;
3176 06 Mar 15 olle 832     frm.bufferAte.value = bufferAte;
3176 06 Mar 15 olle 833
3324 11 May 15 olle 834     // Quality control reagents
3324 11 May 15 olle 835     frm.kapaSybrFast.value = kapaSybrFast;
3501 21 Sep 15 olle 836     frm.qualityControlTemplateQct.value = qualityControlTemplateQct;
3324 11 May 15 olle 837     frm.qualityControlPrimersQcpRgt.value = qualityControlPrimersQcpRgt;
3324 11 May 15 olle 838     frm.qubitDnaHighSens.value = qubitDnaHighSens;
3324 11 May 15 olle 839     frm.qubitDnaBroadRange.value = qubitDnaBroadRange;
3324 11 May 15 olle 840
3176 06 Mar 15 olle 841     if (numImported != numReagentItems)
3176 06 Mar 15 olle 842     {
3176 06 Mar 15 olle 843       Wizard.setInputStatus('reagentFile', 'invalid', 'Could not find values for all ' + numReagentItems + ' samples: ' + numImported);
3176 06 Mar 15 olle 844       return;
3176 06 Mar 15 olle 845     }
3176 06 Mar 15 olle 846
3176 06 Mar 15 olle 847     Wizard.setInputStatus('reagentFile', 'valid');
3176 06 Mar 15 olle 848     reagentFileIsValid = true;
3176 06 Mar 15 olle 849   }
3176 06 Mar 15 olle 850
3176 06 Mar 15 olle 851   exreg.findReagentColumn = function(columns, col)
3176 06 Mar 15 olle 852   {
3176 06 Mar 15 olle 853     var colIndex = columns.indexOf(col);
3176 06 Mar 15 olle 854     if (colIndex == -1)
3176 06 Mar 15 olle 855     {
3176 06 Mar 15 olle 856       Wizard.setInputStatus('reagentFile', 'invalid', 'On line 1; Can\'t find "' + col + '" column');
3176 06 Mar 15 olle 857     }
3176 06 Mar 15 olle 858     return colIndex;
3176 06 Mar 15 olle 859   }
3176 06 Mar 15 olle 860
3176 06 Mar 15 olle 861   exreg.validateStep2 = function(event)
3176 06 Mar 15 olle 862   {
3176 06 Mar 15 olle 863     var valid = true;
3180 17 Mar 15 olle 864     valid &= Wizard.isValid('isolationDate');
3176 06 Mar 15 olle 865     valid &= Wizard.isValid('qiacubeDate');
3176 06 Mar 15 olle 866     valid &= qiacubeRunNoIsValid;
3176 06 Mar 15 olle 867     
3176 06 Mar 15 olle 868     if (!valid) event.preventDefault();
3176 06 Mar 15 olle 869   }
3176 06 Mar 15 olle 870
3176 06 Mar 15 olle 871   
3176 06 Mar 15 olle 872   exreg.initializeStep3 = function()
3176 06 Mar 15 olle 873   {
3176 06 Mar 15 olle 874     var frm = document.forms['meludi'];
3432 29 Jun 15 olle 875     var startListName = frm.startListName.value;
3432 29 Jun 15 olle 876     Doc.element('detailsStartListName').innerHTML = '<b>Start list: ' + startListName + '</b>';
3283 29 Apr 15 olle 877     Doc.element('qubitFileDilutionFactor').value = QUBIT_DILUTION_FACTOR_DEFAULT;
3352 26 May 15 olle 878     var rnaDefaultVolume = ExtractUtils.getNumber(frm.rnaDefaultVolume.value);
3352 26 May 15 olle 879     var dnaDefaultVolume = ExtractUtils.getNumber(frm.dnaDefaultVolume.value);
3176 06 Mar 15 olle 880     qiacubeSortedPrefixes = exreg.getQiacubeSortedPrefixes();
3176 06 Mar 15 olle 881     
3176 06 Mar 15 olle 882     var html = '<table id="detailsTable" class="step-form">';
3176 06 Mar 15 olle 883     // First header row
3176 06 Mar 15 olle 884     html += '<thead>';
3176 06 Mar 15 olle 885     html += '<tr>';
3220 01 Apr 15 olle 886     html += '<th>Extract</th>';
3176 06 Mar 15 olle 887     html += '<th class="dottedleft">QIAcube</th>';
3176 06 Mar 15 olle 888     html += '<th colspan="1" class="dottedleft"></th>';
3276 29 Apr 15 olle 889 /*
3177 09 Mar 15 olle 890     html += '<th colspan="1" class="dottedleft"></th>';
3276 29 Apr 15 olle 891 */
3177 09 Mar 15 olle 892 /*
3176 06 Mar 15 olle 893     html += '<th colspan="5" class="dottedleft">RNA</th>';
3177 09 Mar 15 olle 894 */
3276 29 Apr 15 olle 895 /*
3177 09 Mar 15 olle 896     html += '<th colspan="3" class="dottedleft">RNA</th>';
3176 06 Mar 15 olle 897     html += '<th colspan="4" class="dottedleft">DNA</th>';
3276 29 Apr 15 olle 898 */
3276 29 Apr 15 olle 899     html += '<th colspan="5" class="dottedleft">RNA</th>';
3276 29 Apr 15 olle 900     html += '<th colspan="5" class="dottedleft">DNA</th>';
3176 06 Mar 15 olle 901     html += '<th></th>';
3176 06 Mar 15 olle 902     html += '</tr>';
3176 06 Mar 15 olle 903     // Second header row
3176 06 Mar 15 olle 904     html += '<tr>';
3220 01 Apr 15 olle 905     html += '<th>source item</th>';
3176 06 Mar 15 olle 906     html += '<th class="dottedleft">position</th>';
3176 06 Mar 15 olle 907     html += '<td class="dottedleft">Storage</td>';
3177 09 Mar 15 olle 908 /*
3176 06 Mar 15 olle 909     html += '<td class="dottedleft">Pos</td><td>Vol.</td><td>Conc.</td><td>Quantity</td><td><span id="toggle-normalize-1" class="link" title="Toggle all">Pre-</span></td>';
3177 09 Mar 15 olle 910 */
3276 29 Apr 15 olle 911     html += '<td class="dottedleft">NanoDrop</td><td>RNA</td><td>Vol.</td><td>Conc.</td><td>Quantity</td>';
3276 29 Apr 15 olle 912     html += '<td class="dottedleft">DNA</td><td>Vol.</td><td>Conc.</td><td>Quantity</td><td>ΔCt</td>';
3176 06 Mar 15 olle 913     html += '<td class="dottedleft comment"></td>';
3176 06 Mar 15 olle 914     html += '<td></td>';
3176 06 Mar 15 olle 915     html += '</tr>';
3176 06 Mar 15 olle 916     // Third header row
3176 06 Mar 15 olle 917     html += '<tr>';
3176 06 Mar 15 olle 918     html += '<th></th>';
3176 06 Mar 15 olle 919     html += '<th class="dottedleft"></th>';
3176 06 Mar 15 olle 920     html += '<td class="dottedleft">box</td>';
3177 09 Mar 15 olle 921 /*
3176 06 Mar 15 olle 922     html += '<td class="dottedleft"></td><td>(µl)</td><td>(ng/µl)</td><td>(µg)</td><td><span id="toggle-normalize-2" class="link" title="Toggle all">normalize</span></td>';
3177 09 Mar 15 olle 923 */
3276 29 Apr 15 olle 924     html += '<td class="dottedleft">Pos</td><td>Plate Pos.</td><td>(µl)</td><td>(ng/µl)</td><td>(µg)</td>';
3276 29 Apr 15 olle 925     html += '<td class="dottedleft">Plate Pos.</td><td>(µl)</td><td>(ng/µl)</td><td>(µg)</td><td></td>';
3176 06 Mar 15 olle 926     html += '<td class="dottedleft comment"></td>';
3176 06 Mar 15 olle 927     html += '<td></td>';
3176 06 Mar 15 olle 928     html += '</tr>';
3176 06 Mar 15 olle 929     html += '</thead>';
3176 06 Mar 15 olle 930     html += '<tbody>';
3176 06 Mar 15 olle 931
3176 06 Mar 15 olle 932     // Get list of selected extract source items
3176 06 Mar 15 olle 933     var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 934     var numItems = selItemsList.length;
3176 06 Mar 15 olle 935     var numSpecimenItems = exreg.getNumberOfSpecimenItems();
3176 06 Mar 15 olle 936     var numRnaItems = exreg.getNumberOfRnaItems();
3176 06 Mar 15 olle 937     var numDnaItems = exreg.getNumberOfDnaItems();
3176 06 Mar 15 olle 938     var numNanoDropItems = numSpecimenItems + numRnaItems;
3432 29 Jun 15 olle 939     var numQiacubeItems = numSpecimenItems;
3432 29 Jun 15 olle 940     var totNumItems = numItems;
3176 06 Mar 15 olle 941     var itemNo = 0;
3180 17 Mar 15 olle 942     var qiacubeItemNo = 0;
3176 06 Mar 15 olle 943     // Set default values for DNA/RNA extraction
3180 17 Mar 15 olle 944     for (var i = 0; i < totNumItems; i++)
3176 06 Mar 15 olle 945     {
3176 06 Mar 15 olle 946       itemNo++;
3180 17 Mar 15 olle 947       var item = null;
3180 17 Mar 15 olle 948       var storageBox = '-';
3276 29 Apr 15 olle 949       var rnaStorageBox = '-';
3276 29 Apr 15 olle 950       var dnaStorageBox = '-';
3432 29 Jun 15 olle 951       // MeLuDI extract source item
3432 29 Jun 15 olle 952       item = selItemsList[i];
3432 29 Jun 15 olle 953       var qiacubePos = null;
3432 29 Jun 15 olle 954       if (ExtractUtils.isSpecimen(item))
3176 06 Mar 15 olle 955       {
3432 29 Jun 15 olle 956         qiacubeItemNo++;
3432 29 Jun 15 olle 957         qiacubePos = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems, qiacubeItemNo, qiacubeSortedPrefixes);
3432 29 Jun 15 olle 958       }
3180 17 Mar 15 olle 959 /*
3432 29 Jun 15 olle 960       item.originalQuantity = DEFAULT_SPECIMEN_VOLUME;
3432 29 Jun 15 olle 961       item.processedQuantity = DEFAULT_SPECIMEN_USED;
3180 17 Mar 15 olle 962 */
3432 29 Jun 15 olle 963       item.qiacubePosition = qiacubePos;
3432 29 Jun 15 olle 964       item.originalQiacubePosition = qiacubePos;
3176 06 Mar 15 olle 965         
3432 29 Jun 15 olle 966       var rna = {};
3432 29 Jun 15 olle 967       var dna = {};
3432 29 Jun 15 olle 968       // RNA
3432 29 Jun 15 olle 969       rna.name = item.name + '.r';
3432 29 Jun 15 olle 970       rna.volume = rnaDefaultVolume;
3432 29 Jun 15 olle 971       // DNA
3432 29 Jun 15 olle 972       dna.name = item.name + '.d';
3432 29 Jun 15 olle 973       dna.volume = dnaDefaultVolume;
3276 29 Apr 15 olle 974 /*        
3432 29 Jun 15 olle 975       item.rna = rna;
3432 29 Jun 15 olle 976       item.dna = dna;
3432 29 Jun 15 olle 977 */
3720 22 Jan 16 olle 978       if (item.rna == null)
3432 29 Jun 15 olle 979       {
3180 17 Mar 15 olle 980         item.rna = rna;
3432 29 Jun 15 olle 981       }
3720 22 Jan 16 olle 982       else if (item.rna.volume == null)
3432 29 Jun 15 olle 983       {
3432 29 Jun 15 olle 984         item.rna.volume = rnaDefaultVolume;
3432 29 Jun 15 olle 985       }
3720 22 Jan 16 olle 986       if (item.dna == null)
3432 29 Jun 15 olle 987       {
3180 17 Mar 15 olle 988         item.dna = dna;
3432 29 Jun 15 olle 989       }
3720 22 Jan 16 olle 990       else if (item.dna.volume == null)
3432 29 Jun 15 olle 991       {
3432 29 Jun 15 olle 992         item.dna.volume = dnaDefaultVolume;
3432 29 Jun 15 olle 993       }
3180 17 Mar 15 olle 994 /*
3432 29 Jun 15 olle 995       var storageBox = '-';
3180 17 Mar 15 olle 996 */
3432 29 Jun 15 olle 997       // Input extract source item specimen/RNA/DNA
3432 29 Jun 15 olle 998       if (item.bioWell != null)
3432 29 Jun 15 olle 999       {
3432 29 Jun 15 olle 1000         storageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3180 17 Mar 15 olle 1001       }
3432 29 Jun 15 olle 1002       // RNA extract from specimen
3432 29 Jun 15 olle 1003       if (item.rna && item.rna.bioWell)
3176 06 Mar 15 olle 1004       {
3432 29 Jun 15 olle 1005         rnaStorageBox = Strings.encodeTags(item.rna.bioWell.bioPlate.name + '[' + item.rna.bioWell.location + ']');
3176 06 Mar 15 olle 1006       }
3432 29 Jun 15 olle 1007       // DNA extract from specimen
3432 29 Jun 15 olle 1008       if (item.dna && item.dna.bioWell)
3432 29 Jun 15 olle 1009       {
3432 29 Jun 15 olle 1010         dnaStorageBox = Strings.encodeTags(item.dna.bioWell.bioPlate.name + '[' + item.dna.bioWell.location + ']');
3432 29 Jun 15 olle 1011       }
3432 29 Jun 15 olle 1012       // Input RNA item storage location should be displayed in the RNA extract storage location column
3432 29 Jun 15 olle 1013       if (ExtractUtils.isRna(item) && item.bioWell != null)
3432 29 Jun 15 olle 1014       {
3432 29 Jun 15 olle 1015         rnaStorageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3432 29 Jun 15 olle 1016       }
3432 29 Jun 15 olle 1017       // Input DNA item storage location should be displayed in the DNA extract storage location column
3432 29 Jun 15 olle 1018       if (ExtractUtils.isDna(item) && item.bioWell != null)
3432 29 Jun 15 olle 1019       {
3432 29 Jun 15 olle 1020         dnaStorageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3432 29 Jun 15 olle 1021       }
3176 06 Mar 15 olle 1022       html += '<tr class="highlight">';
3176 06 Mar 15 olle 1023       html += '<th>' + Strings.encodeTags(item.name) + '</th>';
3176 06 Mar 15 olle 1024       html += '<td id="qiacubePosition'+i+'" class="dottedleft"></td>';
3176 06 Mar 15 olle 1025       html += '<td class="dottedleft">'+storageBox+'</td>';
3176 06 Mar 15 olle 1026       html += '<td id="rnaPos'+i+'" class="dottedleft"></td>';
3276 29 Apr 15 olle 1027       html += '<td id="rnaPlatePos'+i+'" class="dottedleft">'+rnaStorageBox+'</td>';
3176 06 Mar 15 olle 1028       html += '<td id="rnaVol'+i+'"></td>';
3352 26 May 15 olle 1029       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3224 02 Apr 15 olle 1030       {
3224 02 Apr 15 olle 1031         html += '<td class="bg-filled-50 italic"><input type="text" id="rnaConc'+i+'" style="width: 5em;"></intput></td>';
3224 02 Apr 15 olle 1032       }
3224 02 Apr 15 olle 1033       else
3224 02 Apr 15 olle 1034       {
3224 02 Apr 15 olle 1035         html += '<td id="rnaConc'+i+'" class="bg-filled-50 italic"></td>';
3224 02 Apr 15 olle 1036       }
3224 02 Apr 15 olle 1037       //html += '<td id="rnaConc'+i+'" class="bg-filled-50 italic"></td>';
3176 06 Mar 15 olle 1038       html += '<td id="rnaQuantity'+i+'" class="bg-filled-50 italic"></td>';
3177 09 Mar 15 olle 1039 /*
3352 26 May 15 olle 1040       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3176 06 Mar 15 olle 1041       {
3176 06 Mar 15 olle 1042         html += '<td><input type="checkbox" name="rnaPreNormalize'+i+'" id="rnaPreNormalize'+i+'" disabled>';
3176 06 Mar 15 olle 1043       }
3176 06 Mar 15 olle 1044       else
3176 06 Mar 15 olle 1045       {
3176 06 Mar 15 olle 1046         html += '<td id="rnaPreNormalize'+i+'">-</td>';
3176 06 Mar 15 olle 1047       }
3177 09 Mar 15 olle 1048 */
3177 09 Mar 15 olle 1049 /*
3176 06 Mar 15 olle 1050       html += '<span id="rnaPreNormalize'+i+'.status" class="status">&nbsp;</span></td>';
3177 09 Mar 15 olle 1051 */
3276 29 Apr 15 olle 1052       html += '<td id="dnaPlatePos'+i+'" class="dottedleft">'+dnaStorageBox+'</td>';
3176 06 Mar 15 olle 1053       html += '<td id="dnaVol'+i+'"></td>';
3352 26 May 15 olle 1054       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isDna(item))
3176 06 Mar 15 olle 1055       {
3224 02 Apr 15 olle 1056         html += '<td class="bg-filled-50 italic"><input type="text" id="dnaConc'+i+'" style="width: 5em;"></intput></td>';
3176 06 Mar 15 olle 1057       }
3176 06 Mar 15 olle 1058       else
3176 06 Mar 15 olle 1059       {
3224 02 Apr 15 olle 1060         html += '<td id="dnaConc'+i+'"  class="bg-filled-50 italic">-</td>';
3176 06 Mar 15 olle 1061       }
3176 06 Mar 15 olle 1062       html += '<td id="dnaQuantity'+i+'" class="bg-filled-50 italic"></td>';
3352 26 May 15 olle 1063       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isDna(item))
3224 02 Apr 15 olle 1064       {
3224 02 Apr 15 olle 1065         html += '<td class="bg-filled-50 italic"><input type="text" id="deltaCt'+i+'" style="width: 5em;"></intput></td>';
3224 02 Apr 15 olle 1066       }
3224 02 Apr 15 olle 1067       else
3224 02 Apr 15 olle 1068       {
3224 02 Apr 15 olle 1069         html += '<td id="deltaCt'+i+'" class="bg-filled-50 italic"></td>';
3224 02 Apr 15 olle 1070       }
3224 02 Apr 15 olle 1071       //html += '<td id="deltaCt'+i+'" class="bg-filled-50 italic"></td>';
3176 06 Mar 15 olle 1072       html += '<td id="comments'+i+'" class="dottedleft comment"></td>';
3365 03 Jun 15 olle 1073       if (i < numItems)
3365 03 Jun 15 olle 1074       {
3365 03 Jun 15 olle 1075         // MeLuDI extract source item
3365 03 Jun 15 olle 1076         html += '<td><div class="button basicbutton interactable edit-details" style="width: 5em;" data-index="'+i+'">Edit&hellip;</div></td>';
3365 03 Jun 15 olle 1077       }
3365 03 Jun 15 olle 1078       else
3365 03 Jun 15 olle 1079       {
3365 03 Jun 15 olle 1080         // Extra QIAcube item
3365 03 Jun 15 olle 1081         html += '<td>-</td>';
3365 03 Jun 15 olle 1082       }
3176 06 Mar 15 olle 1083       html += '</tr>';
3176 06 Mar 15 olle 1084     }
3180 17 Mar 15 olle 1085     if (numQiacubeItems == 1 || numQiacubeItems == 11 || numQiacubeItems == 23)
3176 06 Mar 15 olle 1086     {
3176 06 Mar 15 olle 1087       // Add extra row for counterbalance in QIAcube
3176 06 Mar 15 olle 1088       counterBalanceInfoRow = true;
3176 06 Mar 15 olle 1089       var i = numItems;
3354 27 May 15 olle 1090       var qiacubePos = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems + 1, numQiacubeItems + 1, qiacubeSortedPrefixes);
3176 06 Mar 15 olle 1091         
3176 06 Mar 15 olle 1092       html += '<tr class="highlight">';
3276 29 Apr 15 olle 1093       html += '<th>' + Strings.encodeTags('COUNTER-BALANCE') + '</th>';
3176 06 Mar 15 olle 1094       html += '<td id="qiacubePosition'+i+'" class="dottedleft">'+qiacubePos+'</td>';
3176 06 Mar 15 olle 1095       html += '<td class="dottedleft">-</td>';
3176 06 Mar 15 olle 1096       html += '<td id="rnaPos'+i+'" class="dottedleft">-</td>';
3276 29 Apr 15 olle 1097       html += '<td id="rnaPlatePos'+i+'" class="dottedleft">-</td>';
3176 06 Mar 15 olle 1098       html += '<td id="rnaVol'+i+'">-</td>';
3176 06 Mar 15 olle 1099       html += '<td id="rnaConc'+i+'" class="bg-filled-50 italic">-</td>';
3176 06 Mar 15 olle 1100       html += '<td id="rnaQuantity'+i+'" class="bg-filled-50 italic">-</td>';
3177 09 Mar 15 olle 1101 /*
3176 06 Mar 15 olle 1102       html += '<td>-</td>';
3177 09 Mar 15 olle 1103 */
3276 29 Apr 15 olle 1104       html += '<td id="dnaPlatePos'+i+'" class="dottedleft">-</td>';
3176 06 Mar 15 olle 1105       html += '<td id="dnaVol'+i+'">-</td>';
3224 02 Apr 15 olle 1106       html += '<td id="dnaConc'+i+'" class="bg-filled-50 italic">-</td>';
3176 06 Mar 15 olle 1107       html += '<td id="dnaQuantity'+i+'" class="bg-filled-50 italic">-</td>';
3176 06 Mar 15 olle 1108       html += '<td id="deltaCt'+i+'" class="bg-filled-50 italic">-</td>';
3176 06 Mar 15 olle 1109       html += '<td id="comments'+i+'" class="dottedleft comment">Reminder to use counterbalance</td>';
3176 06 Mar 15 olle 1110       html += '<td>-</td>';
3176 06 Mar 15 olle 1111       html += '</tr>';        
3176 06 Mar 15 olle 1112     }
3176 06 Mar 15 olle 1113     html += '</tbody>';
3176 06 Mar 15 olle 1114     html += '</table>';
3176 06 Mar 15 olle 1115     Doc.element('detailsSection').innerHTML = html;
3176 06 Mar 15 olle 1116     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 1117     {
3224 02 Apr 15 olle 1118       Events.addEventHandler('rnaConc'+i, 'change', exreg.rnaConcOnChange);
3176 06 Mar 15 olle 1119       Events.addEventHandler('dnaConc'+i, 'change', exreg.dnaConcOnChange);
3224 02 Apr 15 olle 1120       Events.addEventHandler('deltaCt'+i, 'change', exreg.deltaCtOnChange);
3176 06 Mar 15 olle 1121     }
3176 06 Mar 15 olle 1122     var buttons = Doc.element('detailsSection').getElementsByClassName('edit-details');
3176 06 Mar 15 olle 1123     for (var i = 0; i < buttons.length; i++)
3176 06 Mar 15 olle 1124     {
3176 06 Mar 15 olle 1125       Buttons.addClickHandler(buttons[i], exreg.editDnaRnaDetails);
3176 06 Mar 15 olle 1126     }
3177 09 Mar 15 olle 1127
3177 09 Mar 15 olle 1128 /*    
3176 06 Mar 15 olle 1129     Events.addEventHandler('toggle-normalize-1', 'click', exreg.toggleNormalize);
3176 06 Mar 15 olle 1130     Events.addEventHandler('toggle-normalize-2', 'click', exreg.toggleNormalize);
3177 09 Mar 15 olle 1131 */
3176 06 Mar 15 olle 1132     
3176 06 Mar 15 olle 1133     exreg.updateDetailsTable();
3176 06 Mar 15 olle 1134     
3176 06 Mar 15 olle 1135     Wizard.setCurrentStep(3);
3176 06 Mar 15 olle 1136     Doc.show('gocancel');
3176 06 Mar 15 olle 1137     Doc.show('gocreate');
3176 06 Mar 15 olle 1138     Doc.show('goregister');
3176 06 Mar 15 olle 1139     Doc.show('btnFakeNanoDropFile');
3176 06 Mar 15 olle 1140     Doc.show('btnFakeDnaInput');
3176 06 Mar 15 olle 1141     Doc.show('btnFakeQPcrFile');
3176 06 Mar 15 olle 1142     
3224 02 Apr 15 olle 1143     //Wizard.setInputStatus('nanoDropFile', 'invalid', 'No file selected');
3176 06 Mar 15 olle 1144     Wizard.keepSessionAlive();
3176 06 Mar 15 olle 1145     
3176 06 Mar 15 olle 1146     if (debug && location.protocol != 'https:') 
3176 06 Mar 15 olle 1147     {
3200 19 Mar 15 olle 1148       Doc.show('debug-tools');
3176 06 Mar 15 olle 1149     }
3176 06 Mar 15 olle 1150   }
3176 06 Mar 15 olle 1151
3176 06 Mar 15 olle 1152   exreg.getQiacubeSortedPrefixes = function()
3176 06 Mar 15 olle 1153   {
3176 06 Mar 15 olle 1154     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 1155     var primaryQiacubePrefix = frm.qiacubePrimaryPrefix.value;
3176 06 Mar 15 olle 1156     var secondaryQiacubePrefix = frm.qiacubeSecondaryPrefix.value;
3176 06 Mar 15 olle 1157
3176 06 Mar 15 olle 1158     // Get string of current QIAcube prefixes in order
3354 27 May 15 olle 1159     var sortedPrefixes = ExtractUtils.getQiacubeSortedPrefixes(primaryQiacubePrefix, secondaryQiacubePrefix);
3176 06 Mar 15 olle 1160     return sortedPrefixes;
3176 06 Mar 15 olle 1161   }
3176 06 Mar 15 olle 1162
3176 06 Mar 15 olle 1163   exreg.toggleNormalize = function()
3176 06 Mar 15 olle 1164   {
3176 06 Mar 15 olle 1165     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 1166     // Get list of selected extract source items
3176 06 Mar 15 olle 1167     var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 1168     var numItems = selItemsList.length;
3176 06 Mar 15 olle 1169     // Toggle normalize check box status
3176 06 Mar 15 olle 1170     var check = null;
3176 06 Mar 15 olle 1171     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 1172     {
3176 06 Mar 15 olle 1173       var item = selItemsList[i];
3352 26 May 15 olle 1174       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3176 06 Mar 15 olle 1175       {
3176 06 Mar 15 olle 1176         if (!frm['rnaPreNormalize'+i].disabled)
3176 06 Mar 15 olle 1177         {
3176 06 Mar 15 olle 1178           if (check == null) check = !frm['rnaPreNormalize'+i].checked;
3176 06 Mar 15 olle 1179           frm['rnaPreNormalize'+i].checked = check;
3176 06 Mar 15 olle 1180         }
3176 06 Mar 15 olle 1181       }
3176 06 Mar 15 olle 1182     }
3176 06 Mar 15 olle 1183   }
3176 06 Mar 15 olle 1184   
3176 06 Mar 15 olle 1185   exreg.getSelectedItemsList = function()
3176 06 Mar 15 olle 1186   {
3176 06 Mar 15 olle 1187     var frm = document.forms['meludi'];
3180 17 Mar 15 olle 1188
3176 06 Mar 15 olle 1189     // Get number of selected extract source items
3176 06 Mar 15 olle 1190     var numItems = 0;
3176 06 Mar 15 olle 1191     var selItemsList = [];
3176 06 Mar 15 olle 1192     for (var i = 0; i < frm.extractSourceItems.length; i++)
3176 06 Mar 15 olle 1193     {
3176 06 Mar 15 olle 1194       if (frm.extractSourceItems[i].selected)
3176 06 Mar 15 olle 1195       {
3212 27 Mar 15 olle 1196         if (frm.extractSourceItems[i].item != null)
3176 06 Mar 15 olle 1197         {
3212 27 Mar 15 olle 1198           selItemsList[numItems] = frm.extractSourceItems[i].item;
3176 06 Mar 15 olle 1199           numItems++;
3176 06 Mar 15 olle 1200         }
3176 06 Mar 15 olle 1201       }
3176 06 Mar 15 olle 1202     }
3176 06 Mar 15 olle 1203     return selItemsList;
3176 06 Mar 15 olle 1204   }
3176 06 Mar 15 olle 1205
3176 06 Mar 15 olle 1206   exreg.getNumberOfSpecimenItems = function()
3176 06 Mar 15 olle 1207   {
3176 06 Mar 15 olle 1208     // Get list of selected extract source items
3176 06 Mar 15 olle 1209     var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 1210     var numItems = selItemsList.length;
3176 06 Mar 15 olle 1211     var numSpecimen = 0;
3176 06 Mar 15 olle 1212     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 1213     {
3176 06 Mar 15 olle 1214       var item = selItemsList[i];
3352 26 May 15 olle 1215       if (ExtractUtils.isSpecimen(item))
3176 06 Mar 15 olle 1216       {
3176 06 Mar 15 olle 1217         numSpecimen++;
3176 06 Mar 15 olle 1218       }
3176 06 Mar 15 olle 1219     }
3176 06 Mar 15 olle 1220     return numSpecimen;
3176 06 Mar 15 olle 1221   }
3176 06 Mar 15 olle 1222   
3176 06 Mar 15 olle 1223   exreg.getNumberOfRnaItems = function()
3176 06 Mar 15 olle 1224   {
3176 06 Mar 15 olle 1225     // Get list of selected extract source items
3176 06 Mar 15 olle 1226     var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 1227     var numItems = selItemsList.length;
3176 06 Mar 15 olle 1228     var numRna = 0;
3176 06 Mar 15 olle 1229     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 1230     {
3176 06 Mar 15 olle 1231       var item = selItemsList[i];
3352 26 May 15 olle 1232       if (ExtractUtils.isRna(item))
3176 06 Mar 15 olle 1233       {
3176 06 Mar 15 olle 1234         numRna++;
3176 06 Mar 15 olle 1235       }
3176 06 Mar 15 olle 1236     }
3176 06 Mar 15 olle 1237     return numRna;
3176 06 Mar 15 olle 1238   }
3176 06 Mar 15 olle 1239   
3176 06 Mar 15 olle 1240   exreg.getNumberOfDnaItems = function()
3176 06 Mar 15 olle 1241   {
3176 06 Mar 15 olle 1242     // Get list of selected extract source items
3176 06 Mar 15 olle 1243     var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 1244     var numItems = selItemsList.length;
3176 06 Mar 15 olle 1245     var numDna = 0;
3176 06 Mar 15 olle 1246     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 1247     {
3176 06 Mar 15 olle 1248       var item = selItemsList[i];
3352 26 May 15 olle 1249       if (ExtractUtils.isDna(item))
3176 06 Mar 15 olle 1250       {
3176 06 Mar 15 olle 1251         numDna++;
3176 06 Mar 15 olle 1252       }
3176 06 Mar 15 olle 1253     }
3176 06 Mar 15 olle 1254     return numDna;
3176 06 Mar 15 olle 1255   }
3176 06 Mar 15 olle 1256   
3224 02 Apr 15 olle 1257   exreg.rnaConcOnChange = function(event)
3224 02 Apr 15 olle 1258   {
3224 02 Apr 15 olle 1259     var frm = document.forms['meludi'];
3224 02 Apr 15 olle 1260     // Get list of selected extract source items
3224 02 Apr 15 olle 1261     var selItemsList = exreg.getSelectedItemsList();
3224 02 Apr 15 olle 1262     var numItems = selItemsList.length;
3224 02 Apr 15 olle 1263     // Update RNA concentration values
3224 02 Apr 15 olle 1264     for (var i = 0; i < numItems; i++)
3224 02 Apr 15 olle 1265     {
3224 02 Apr 15 olle 1266       var item = selItemsList[i];
3224 02 Apr 15 olle 1267       var rnaConc = Doc.element('rnaConc'+i);
3224 02 Apr 15 olle 1268       if (rnaConc != null)
3224 02 Apr 15 olle 1269       {
3224 02 Apr 15 olle 1270         if (rnaConc.value != null && rnaConc.value != '' && rnaConc.value != '-')
3224 02 Apr 15 olle 1271         {
3439 06 Jul 15 olle 1272           var conc = ExtractUtils.getNumber(rnaConc.value);
3439 06 Jul 15 olle 1273           if (conc < 0)
3439 06 Jul 15 olle 1274           {
3439 06 Jul 15 olle 1275             conc = 0.0;
3439 06 Jul 15 olle 1276           }
3439 06 Jul 15 olle 1277           item.rna.ndConc = conc;
3224 02 Apr 15 olle 1278         }
3224 02 Apr 15 olle 1279         else
3224 02 Apr 15 olle 1280         {
3224 02 Apr 15 olle 1281           item.rna.ndConc = null;
3224 02 Apr 15 olle 1282         }
3224 02 Apr 15 olle 1283       }
3224 02 Apr 15 olle 1284     }
3224 02 Apr 15 olle 1285     exreg.updateDetailsTable();
3224 02 Apr 15 olle 1286   }
3224 02 Apr 15 olle 1287
3176 06 Mar 15 olle 1288   exreg.dnaConcOnChange = function(event)
3176 06 Mar 15 olle 1289   {
3176 06 Mar 15 olle 1290     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 1291     // Get list of selected extract source items
3176 06 Mar 15 olle 1292     var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 1293     var numItems = selItemsList.length;
3176 06 Mar 15 olle 1294     // Update DNA concentration values
3176 06 Mar 15 olle 1295     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 1296     {
3176 06 Mar 15 olle 1297       var item = selItemsList[i];
3176 06 Mar 15 olle 1298       var dnaConc = Doc.element('dnaConc'+i);
3176 06 Mar 15 olle 1299       if (dnaConc != null)
3176 06 Mar 15 olle 1300       {
3176 06 Mar 15 olle 1301         if (dnaConc.value != null && dnaConc.value != '' && dnaConc.value != '-')
3176 06 Mar 15 olle 1302         {
3439 06 Jul 15 olle 1303           var conc = ExtractUtils.getNumber(dnaConc.value);
3439 06 Jul 15 olle 1304           if (conc < 0)
3439 06 Jul 15 olle 1305           {
3439 06 Jul 15 olle 1306             conc = 0.0;
3439 06 Jul 15 olle 1307           }
3439 06 Jul 15 olle 1308           item.dna.qubitConc = conc;
3176 06 Mar 15 olle 1309         }
3176 06 Mar 15 olle 1310         else
3176 06 Mar 15 olle 1311         {
3176 06 Mar 15 olle 1312           item.dna.qubitConc = null;
3176 06 Mar 15 olle 1313         }
3176 06 Mar 15 olle 1314       }
3176 06 Mar 15 olle 1315     }
3176 06 Mar 15 olle 1316     exreg.updateDetailsTable();
3176 06 Mar 15 olle 1317   }
3176 06 Mar 15 olle 1318
3224 02 Apr 15 olle 1319   exreg.deltaCtOnChange = function(event)
3224 02 Apr 15 olle 1320   {
3224 02 Apr 15 olle 1321     var frm = document.forms['meludi'];
3224 02 Apr 15 olle 1322     // Get list of selected extract source items
3224 02 Apr 15 olle 1323     var selItemsList = exreg.getSelectedItemsList();
3224 02 Apr 15 olle 1324     var numItems = selItemsList.length;
3224 02 Apr 15 olle 1325     // Update DNA deltaCt values
3224 02 Apr 15 olle 1326     for (var i = 0; i < numItems; i++)
3224 02 Apr 15 olle 1327     {
3224 02 Apr 15 olle 1328       var item = selItemsList[i];
3224 02 Apr 15 olle 1329       var deltaCt = Doc.element('deltaCt'+i);
3224 02 Apr 15 olle 1330       if (deltaCt != null)
3224 02 Apr 15 olle 1331       {
3224 02 Apr 15 olle 1332         if (deltaCt.value != null && deltaCt.value != '' && deltaCt.value != '-')
3224 02 Apr 15 olle 1333         {
3352 26 May 15 olle 1334           item.dna.deltaCt = ExtractUtils.getNumber(deltaCt.value);
3224 02 Apr 15 olle 1335         }
3224 02 Apr 15 olle 1336         else
3224 02 Apr 15 olle 1337         {
3224 02 Apr 15 olle 1338           item.dna.deltaCt = null;
3224 02 Apr 15 olle 1339         }
3224 02 Apr 15 olle 1340       }
3224 02 Apr 15 olle 1341     }
3224 02 Apr 15 olle 1342     exreg.updateDetailsTable();
3224 02 Apr 15 olle 1343   }
3224 02 Apr 15 olle 1344
3176 06 Mar 15 olle 1345   exreg.updateDetailsTable = function()
3176 06 Mar 15 olle 1346   {
3176 06 Mar 15 olle 1347     var frm = document.forms['meludi'];
3352 26 May 15 olle 1348     var rnaDefaultVolume = ExtractUtils.getNumber(frm.rnaDefaultVolume.value);
3352 26 May 15 olle 1349     var dnaDefaultVolume = ExtractUtils.getNumber(frm.dnaDefaultVolume.value);
3176 06 Mar 15 olle 1350     var hasQiacubePosition = [];
3176 06 Mar 15 olle 1351     var duplicatePosition = 0;
3176 06 Mar 15 olle 1352
3354 27 May 15 olle 1353     qiacubeSortedPrefixes = exreg.getQiacubeSortedPrefixes();
3176 06 Mar 15 olle 1354     // Get list of selected extract source items
3176 06 Mar 15 olle 1355     var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 1356     var numItems = selItemsList.length;
3432 29 Jun 15 olle 1357     var totNumItems = numItems;
3176 06 Mar 15 olle 1358     // Get sorted list of used integer QIAcube positions for specimens, generalized for more than one QIAcube
3176 06 Mar 15 olle 1359     var specSortedIntQiacubePosition = [];
3180 17 Mar 15 olle 1360     var qiacubeItemNo = 0;
3180 17 Mar 15 olle 1361     for (var i = 0; i < totNumItems; i++)
3176 06 Mar 15 olle 1362     {
3432 29 Jun 15 olle 1363       var item = selItemsList[i];
3432 29 Jun 15 olle 1364       if (ExtractUtils.isSpecimen(item))
3176 06 Mar 15 olle 1365       {
3354 27 May 15 olle 1366         var intQiacubePosition = ExtractUtils.getIntQiacubePosition(item.qiacubePosition, qiacubeSortedPrefixes);
3180 17 Mar 15 olle 1367         specSortedIntQiacubePosition[qiacubeItemNo] = intQiacubePosition;
3180 17 Mar 15 olle 1368         qiacubeItemNo++;
3176 06 Mar 15 olle 1369       }
3176 06 Mar 15 olle 1370     }
3176 06 Mar 15 olle 1371     // Sort for ascending integer values
3176 06 Mar 15 olle 1372     specSortedIntQiacubePosition.sort(function(a,b){return a-b});
3176 06 Mar 15 olle 1373     var numSpecimenItems = exreg.getNumberOfSpecimenItems();
3176 06 Mar 15 olle 1374     var numRnaItems = exreg.getNumberOfRnaItems();
3176 06 Mar 15 olle 1375     var numDnaItems = exreg.getNumberOfDnaItems();
3176 06 Mar 15 olle 1376     var numNanoDropItems = numSpecimenItems + numRnaItems;
3176 06 Mar 15 olle 1377     var rnaItemNo = 0;
3176 06 Mar 15 olle 1378     // Set default values for DNA/RNA extraction
3180 17 Mar 15 olle 1379     for (var i = 0; i < totNumItems; i++)
3176 06 Mar 15 olle 1380     {
3180 17 Mar 15 olle 1381       var item = null;
3180 17 Mar 15 olle 1382       if (i < numItems)
3180 17 Mar 15 olle 1383       {
3180 17 Mar 15 olle 1384         item = selItemsList[i];
3180 17 Mar 15 olle 1385       }
3180 17 Mar 15 olle 1386       else
3180 17 Mar 15 olle 1387       {
3180 17 Mar 15 olle 1388         // Extra QIAcube item
3180 17 Mar 15 olle 1389         item = extraItemsList[i - numItems];
3180 17 Mar 15 olle 1390       }
3176 06 Mar 15 olle 1391       Doc.element('qiacubePosition'+i).innerHTML = item.qiacubePosition;
3176 06 Mar 15 olle 1392       Doc.addOrRemoveClass('qiacubePosition'+i, 'nondefault', item.qiacubePosition != item.originalQiacubePosition);
3176 06 Mar 15 olle 1393
3354 27 May 15 olle 1394       var intQiacubePosition = ExtractUtils.getIntQiacubePosition(item.qiacubePosition, qiacubeSortedPrefixes);      
3176 06 Mar 15 olle 1395       if (intQiacubePosition != null)
3176 06 Mar 15 olle 1396       {
3176 06 Mar 15 olle 1397         if (hasQiacubePosition[intQiacubePosition])
3176 06 Mar 15 olle 1398         {
3176 06 Mar 15 olle 1399           duplicatePosition = intQiacubePosition;
3176 06 Mar 15 olle 1400         }
3176 06 Mar 15 olle 1401         else
3176 06 Mar 15 olle 1402         {
3176 06 Mar 15 olle 1403           hasQiacubePosition[intQiacubePosition] = true;
3176 06 Mar 15 olle 1404         }
3176 06 Mar 15 olle 1405       }
3176 06 Mar 15 olle 1406       var intNanoDropPlatePosition = intQiacubePosition;
3176 06 Mar 15 olle 1407       // Get integer NanoDrop position for specimens from index in sorted list of used integer QIAcube positions
3176 06 Mar 15 olle 1408       if (intQiacubePosition)
3176 06 Mar 15 olle 1409       {
3176 06 Mar 15 olle 1410         var sortIndex = -1;
3176 06 Mar 15 olle 1411         for (var j = 0; j < specSortedIntQiacubePosition.length; j++)
3176 06 Mar 15 olle 1412         {
3176 06 Mar 15 olle 1413           if (intQiacubePosition == specSortedIntQiacubePosition[j])
3176 06 Mar 15 olle 1414           {
3176 06 Mar 15 olle 1415             sortIndex = j;
3176 06 Mar 15 olle 1416           }
3176 06 Mar 15 olle 1417         }
3176 06 Mar 15 olle 1418         if (sortIndex > -1)
3176 06 Mar 15 olle 1419         {
3176 06 Mar 15 olle 1420           intNanoDropPlatePosition = sortIndex + 1;
3176 06 Mar 15 olle 1421         }
3176 06 Mar 15 olle 1422       }
3352 26 May 15 olle 1423       if (ExtractUtils.isRna(item))
3176 06 Mar 15 olle 1424       {
3176 06 Mar 15 olle 1425         rnaItemNo++;
3176 06 Mar 15 olle 1426         intNanoDropPlatePosition = numSpecimenItems + rnaItemNo;
3176 06 Mar 15 olle 1427       }
3176 06 Mar 15 olle 1428       
3176 06 Mar 15 olle 1429       // Calculate NanoDrop well from Qiacube position
3176 06 Mar 15 olle 1430       var row;
3176 06 Mar 15 olle 1431       var col;
3176 06 Mar 15 olle 1432       // Specimens from up to two QIAcube instruments and input RNA items placed on one NanoDrop plate
3176 06 Mar 15 olle 1433       if (intNanoDropPlatePosition > 16)
3176 06 Mar 15 olle 1434       {
3176 06 Mar 15 olle 1435         // (17 - 24) NanoDrop plate for QIAcube 'A', positions A3 - H3
3176 06 Mar 15 olle 1436         row = intNanoDropPlatePosition - 17;
3176 06 Mar 15 olle 1437         col = 3;
3176 06 Mar 15 olle 1438       }
3176 06 Mar 15 olle 1439       else if (intNanoDropPlatePosition > 8)
3176 06 Mar 15 olle 1440       {
3176 06 Mar 15 olle 1441         // ( 9 - 12) NanoDrop plate for QIAcube 'C', positions A2 - D2
3176 06 Mar 15 olle 1442         // (13 - 16) NanoDrop plate for QIAcube 'A', positions E2 - H2
3176 06 Mar 15 olle 1443         row = intNanoDropPlatePosition - 9;
3176 06 Mar 15 olle 1444         col = 2;
3176 06 Mar 15 olle 1445       }
3176 06 Mar 15 olle 1446       else if (intNanoDropPlatePosition > 0)
3176 06 Mar 15 olle 1447       {
3176 06 Mar 15 olle 1448         // ( 1 -  8) NanoDrop plate for QIAcube 'C', positions A1 - H1
3176 06 Mar 15 olle 1449         row = intNanoDropPlatePosition - 1;
3176 06 Mar 15 olle 1450         col = 1;
3176 06 Mar 15 olle 1451       }
3180 17 Mar 15 olle 1452       if (i < numItems)
3176 06 Mar 15 olle 1453       {
3268 23 Apr 15 olle 1454
3352 26 May 15 olle 1455         if (!ExtractUtils.isDna(item))
3180 17 Mar 15 olle 1456         {
3176 06 Mar 15 olle 1457 /*
3180 17 Mar 15 olle 1458           item.dna.well = Meludi.wellToAlpha(row) + (col+3);
3176 06 Mar 15 olle 1459 */
3276 29 Apr 15 olle 1460           //item.rna.well = Meludi.wellToAlpha(row) + col;
3276 29 Apr 15 olle 1461           item.rna.nanoDropWell = Meludi.wellToAlpha(row) + col;
3180 17 Mar 15 olle 1462         }
3180 17 Mar 15 olle 1463         else
3180 17 Mar 15 olle 1464         {
3276 29 Apr 15 olle 1465           //item.dna.well = null;
3276 29 Apr 15 olle 1466           item.rna.nanoDropWell = null;
3180 17 Mar 15 olle 1467         }
3176 06 Mar 15 olle 1468
3312 07 May 15 olle 1469         // Update concentration and deltaCt data for input DNA/RNA
3352 26 May 15 olle 1470         if (ExtractUtils.isRna(item))
3312 07 May 15 olle 1471         {
3720 22 Jan 16 olle 1472           if (item.rna.ndConc == null)
3312 07 May 15 olle 1473           {
3312 07 May 15 olle 1474             item.rna.ndConc = item.ndConc;
3312 07 May 15 olle 1475           }
3312 07 May 15 olle 1476         }
3352 26 May 15 olle 1477         if (ExtractUtils.isDna(item))
3312 07 May 15 olle 1478         {
3720 22 Jan 16 olle 1479           if (item.dna.qubitConc == null)
3312 07 May 15 olle 1480           {
3312 07 May 15 olle 1481             item.dna.qubitConc = item.qubitConc;
3312 07 May 15 olle 1482           }
3720 22 Jan 16 olle 1483           if (item.dna.deltaCt == null)
3312 07 May 15 olle 1484           {
3312 07 May 15 olle 1485             item.dna.deltaCt = item.deltaCt;
3312 07 May 15 olle 1486           }
3312 07 May 15 olle 1487         }
3312 07 May 15 olle 1488
3180 17 Mar 15 olle 1489         Doc.element('dnaVol'+i).innerHTML = item.dna.volume;
3180 17 Mar 15 olle 1490         Doc.addOrRemoveClass('dnaVol'+i, 'nondefault', item.dna.volume != dnaDefaultVolume);
3180 17 Mar 15 olle 1491         var dnaConc = Doc.element('dnaConc'+i);
3180 17 Mar 15 olle 1492         if (dnaConc != null)
3176 06 Mar 15 olle 1493         {
3224 02 Apr 15 olle 1494           dnaConc.value = Meludi.formatNumber(item.dna.qubitConc) || '';
3224 02 Apr 15 olle 1495           dnaConc.title = '260/280=' + item.dna.nd260by280 + '\n260/230=' + item.dna.nd260by230;
3180 17 Mar 15 olle 1496           var dnaConcValue = dnaConc.value;
3180 17 Mar 15 olle 1497           if (dnaConcValue != null && dnaConcValue != '-' && dnaConcValue != '')
3180 17 Mar 15 olle 1498           {
3352 26 May 15 olle 1499             item.dna.qubitConc = ExtractUtils.getNumber(dnaConcValue);
3180 17 Mar 15 olle 1500           }
3176 06 Mar 15 olle 1501         }
3180 17 Mar 15 olle 1502         item.dna.quantity = item.dna.qubitConc * item.dna.volume / 1000;
3180 17 Mar 15 olle 1503         Doc.element('dnaQuantity'+i).innerHTML = Meludi.formatNumber(item.dna.quantity || null, null, 2) || '-';
3176 06 Mar 15 olle 1504
3180 17 Mar 15 olle 1505         var deltaCt = Doc.element('deltaCt'+i);
3180 17 Mar 15 olle 1506         if (deltaCt != null)
3176 06 Mar 15 olle 1507         {
3224 02 Apr 15 olle 1508           deltaCt.value = Meludi.formatNumber(item.dna.deltaCt) || '';
3180 17 Mar 15 olle 1509           var deltaCtValue = deltaCt.value;
3180 17 Mar 15 olle 1510           if (deltaCtValue != null && deltaCtValue != '-' && deltaCtValue != '')
3180 17 Mar 15 olle 1511           {
3352 26 May 15 olle 1512             item.dna.deltaCt = ExtractUtils.getNumber(deltaCtValue);
3180 17 Mar 15 olle 1513           }
3180 17 Mar 15 olle 1514           deltaCt.innerHTML = Meludi.formatNumber(item.dna.deltaCt) || '-';
3176 06 Mar 15 olle 1515         }
3176 06 Mar 15 olle 1516       
3276 29 Apr 15 olle 1517         //Doc.element('rnaPos'+i).innerHTML = item.rna.well;
3276 29 Apr 15 olle 1518         Doc.element('rnaPos'+i).innerHTML = item.rna.nanoDropWell;
3180 17 Mar 15 olle 1519         Doc.addOrRemoveClass('rnaPos'+i, 'nondefault', item.qiacubePosition != item.originalQiacubePosition);
3224 02 Apr 15 olle 1520         
3180 17 Mar 15 olle 1521         Doc.element('rnaVol'+i).innerHTML = item.rna.volume;
3180 17 Mar 15 olle 1522         Doc.addOrRemoveClass('rnaVol'+i, 'nondefault', item.rna.volume != rnaDefaultVolume);
3180 17 Mar 15 olle 1523         var rnaConc = Doc.element('rnaConc'+i);
3224 02 Apr 15 olle 1524         if (rnaConc != null)
3224 02 Apr 15 olle 1525         {
3224 02 Apr 15 olle 1526           rnaConc.value = Meludi.formatNumber(item.rna.ndConc) || '';
3224 02 Apr 15 olle 1527           rnaConc.title = '260/280=' + item.rna.nd260by280 + '\n260/230=' + item.rna.nd260by230;
3224 02 Apr 15 olle 1528           var rnaConcValue = rnaConc.value;
3224 02 Apr 15 olle 1529           if (rnaConcValue != null && rnaConcValue != '-' && rnaConcValue != '')
3224 02 Apr 15 olle 1530           {
3352 26 May 15 olle 1531             item.rna.ndConc = ExtractUtils.getNumber(rnaConcValue);
3224 02 Apr 15 olle 1532           }
3224 02 Apr 15 olle 1533         }
3180 17 Mar 15 olle 1534         item.rna.quantity = item.rna.ndConc * item.rna.volume / 1000;
3224 02 Apr 15 olle 1535         Doc.element('rnaQuantity'+i).innerHTML = Meludi.formatNumber(item.rna.quantity || null, null, 2) || '-';
3224 02 Apr 15 olle 1536
3180 17 Mar 15 olle 1537         var enoughQuantity = item.rna.quantity >= MINIMAL_PRE_NORMALIZE_QUANTITY;
3180 17 Mar 15 olle 1538         item.rna.flag = enoughQuantity ? null : 'NotEnoughRemainingQuantity';
3176 06 Mar 15 olle 1539         
3352 26 May 15 olle 1540         if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3180 17 Mar 15 olle 1541         {
3177 09 Mar 15 olle 1542 /*
3180 17 Mar 15 olle 1543           frm['rnaPreNormalize'+i].disabled = !enoughQuantity;
3177 09 Mar 15 olle 1544 */
3180 17 Mar 15 olle 1545           Doc.element('rnaQuantity'+i).innerHTML = Meludi.formatNumber(item.rna.quantity || null, null, 2) || '-';
3177 09 Mar 15 olle 1546 /*
3180 17 Mar 15 olle 1547           frm['rnaPreNormalize'+i].checked = enoughQuantity;
3180 17 Mar 15 olle 1548           var warning = item.rna.quantity && !enoughQuantity;
3180 17 Mar 15 olle 1549           Wizard.setInputStatus('rnaPreNormalize'+i, warning ? 'flag' : '', warning ? 'Not enough quantity' : '');
3177 09 Mar 15 olle 1550 */
3180 17 Mar 15 olle 1551         }
3176 06 Mar 15 olle 1552
3180 17 Mar 15 olle 1553         var cmnt = Doc.element('comments'+i);
3180 17 Mar 15 olle 1554         var tooltip = [];
3180 17 Mar 15 olle 1555         var comment = [];
3311 07 May 15 olle 1556         // Update comment data with description data
3311 07 May 15 olle 1557         if (item.description || item.dna.description || item.rna.description)
3311 07 May 15 olle 1558         {
3352 26 May 15 olle 1559           if (ExtractUtils.isSpecimen(item))
3311 07 May 15 olle 1560           {          
3311 07 May 15 olle 1561             if (item.description)
3311 07 May 15 olle 1562             {
3720 22 Jan 16 olle 1563               if (item.comment == null)
3311 07 May 15 olle 1564               {
3311 07 May 15 olle 1565                 item.comment = item.description;
3311 07 May 15 olle 1566               }
3311 07 May 15 olle 1567             }
3311 07 May 15 olle 1568             if (item.rna.description)
3311 07 May 15 olle 1569             {
3720 22 Jan 16 olle 1570               if (item.rna.comment == null)
3311 07 May 15 olle 1571               {
3311 07 May 15 olle 1572                 item.rna.comment = item.rna.description;
3311 07 May 15 olle 1573               }
3311 07 May 15 olle 1574             }
3311 07 May 15 olle 1575             if (item.dna.description)
3311 07 May 15 olle 1576             {
3720 22 Jan 16 olle 1577               if (item.dna.comment == null)
3311 07 May 15 olle 1578               {
3311 07 May 15 olle 1579                 item.dna.comment = item.dna.description;
3311 07 May 15 olle 1580               }
3311 07 May 15 olle 1581             }
3311 07 May 15 olle 1582           }
3352 26 May 15 olle 1583           if (ExtractUtils.isRna(item))
3311 07 May 15 olle 1584           {          
3311 07 May 15 olle 1585             if (item.description)
3311 07 May 15 olle 1586             {
3720 22 Jan 16 olle 1587               if (item.rna.comment == null)
3311 07 May 15 olle 1588               {
3311 07 May 15 olle 1589                 item.rna.comment = item.description;
3311 07 May 15 olle 1590               }
3311 07 May 15 olle 1591             }
3311 07 May 15 olle 1592             if (item.rna.description)
3311 07 May 15 olle 1593             {
3720 22 Jan 16 olle 1594               if (item.rna.comment == null)
3311 07 May 15 olle 1595               {
3311 07 May 15 olle 1596                 item.rna.comment = item.rna.description;
3311 07 May 15 olle 1597               }
3311 07 May 15 olle 1598             }
3311 07 May 15 olle 1599           }
3352 26 May 15 olle 1600           if (ExtractUtils.isDna(item))
3311 07 May 15 olle 1601           {          
3311 07 May 15 olle 1602             if (item.description)
3311 07 May 15 olle 1603             {
3720 22 Jan 16 olle 1604               if (item.dna.comment == null)
3311 07 May 15 olle 1605               {
3311 07 May 15 olle 1606                 item.dna.comment = item.description;
3311 07 May 15 olle 1607               }
3311 07 May 15 olle 1608             }
3311 07 May 15 olle 1609             if (item.dna.description)
3311 07 May 15 olle 1610             {
3720 22 Jan 16 olle 1611               if (item.dna.comment == null)
3311 07 May 15 olle 1612               {
3311 07 May 15 olle 1613                 item.dna.comment = item.dna.description;
3311 07 May 15 olle 1614               }
3311 07 May 15 olle 1615             }
3311 07 May 15 olle 1616           }
3311 07 May 15 olle 1617         }
3246 14 Apr 15 olle 1618         if (item.operatorDeliveryComment || item.comment || item.dna.comment || item.rna.comment)
3180 17 Mar 15 olle 1619         {
3246 14 Apr 15 olle 1620           // Display operator delivery comments directly in the comment field
3246 14 Apr 15 olle 1621           if (item.operatorDeliveryComment)
3246 14 Apr 15 olle 1622           {
3246 14 Apr 15 olle 1623             comment[0] = item.operatorDeliveryComment;
3246 14 Apr 15 olle 1624             tooltip[tooltip.length] = 'Op.Del.Cmt: ' + item.operatorDeliveryComment;
3246 14 Apr 15 olle 1625           }
3246 14 Apr 15 olle 1626           else
3246 14 Apr 15 olle 1627           {
3246 14 Apr 15 olle 1628             comment[0] = 'Yes';
3246 14 Apr 15 olle 1629           }
3180 17 Mar 15 olle 1630           if (item.comment) tooltip[tooltip.length] = 'Specimen: ' + item.comment;
3180 17 Mar 15 olle 1631           if (item.rna.comment) tooltip[tooltip.length] = 'RNA: ' + item.rna.comment;
3180 17 Mar 15 olle 1632           if (item.dna.comment) tooltip[tooltip.length] = 'DNA: ' + item.dna.comment;
3180 17 Mar 15 olle 1633         }
3176 06 Mar 15 olle 1634         
3180 17 Mar 15 olle 1635         var modifiedReagents = false;
3180 17 Mar 15 olle 1636         for (var rgNo = 0; rgNo < exreg.REAGENTS.length; rgNo++)
3176 06 Mar 15 olle 1637         {
3180 17 Mar 15 olle 1638           var rg = exreg.REAGENTS[rgNo];
3180 17 Mar 15 olle 1639           if (item[rg]) 
3180 17 Mar 15 olle 1640           {
3180 17 Mar 15 olle 1641             tooltip[tooltip.length] = Doc.element(rg+'.title').innerHTML + ': ' + Strings.encodeTags(item[rg]);
3180 17 Mar 15 olle 1642             modifiedReagents = true;
3180 17 Mar 15 olle 1643           }
3176 06 Mar 15 olle 1644         }
3180 17 Mar 15 olle 1645         if (modifiedReagents)
3180 17 Mar 15 olle 1646         {
3180 17 Mar 15 olle 1647           comment[comment.length] = 'Reagents';
3180 17 Mar 15 olle 1648         }
3176 06 Mar 15 olle 1649         
3180 17 Mar 15 olle 1650         if (tooltip.length > 0)
3180 17 Mar 15 olle 1651         {
3180 17 Mar 15 olle 1652           cmnt.innerHTML = comment.join(', ');
3180 17 Mar 15 olle 1653           Doc.addClass(cmnt, 'nondefault');
3180 17 Mar 15 olle 1654           cmnt.title = tooltip.join('\n');
3180 17 Mar 15 olle 1655         }
3180 17 Mar 15 olle 1656         else
3180 17 Mar 15 olle 1657         {
3180 17 Mar 15 olle 1658           cmnt.innerHTML = '';
3180 17 Mar 15 olle 1659           Doc.removeClass(cmnt, 'nondefault');
3180 17 Mar 15 olle 1660           cmnt.title = null;
3180 17 Mar 15 olle 1661         }
3176 06 Mar 15 olle 1662       }
3176 06 Mar 15 olle 1663     }
3176 06 Mar 15 olle 1664     
3176 06 Mar 15 olle 1665     if (duplicatePosition)
3176 06 Mar 15 olle 1666     {
3354 27 May 15 olle 1667       var duplicatePositionStr = ExtractUtils.getDetailedQiacubePosition(duplicatePosition, qiacubeSortedPrefixes);
3176 06 Mar 15 olle 1668       qiacubePositionsAreValid = false;
3176 06 Mar 15 olle 1669     }
3176 06 Mar 15 olle 1670     else
3176 06 Mar 15 olle 1671     {
3176 06 Mar 15 olle 1672       qiacubePositionsAreValid = true;
3176 06 Mar 15 olle 1673     }
3176 06 Mar 15 olle 1674   }
3176 06 Mar 15 olle 1675
3176 06 Mar 15 olle 1676   exreg.editDnaRnaDetails = function(event)
3176 06 Mar 15 olle 1677   {
3176 06 Mar 15 olle 1678     var index = Data.get(event.currentTarget, 'index');
3176 06 Mar 15 olle 1679     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 1680     // Get list of selected extract source items
3176 06 Mar 15 olle 1681     var selItemsList = exreg.getSelectedItemsList();
3180 17 Mar 15 olle 1682     var numItems = selItemsList.length;
3180 17 Mar 15 olle 1683     var item = null;
3180 17 Mar 15 olle 1684     if (index < numItems)
3180 17 Mar 15 olle 1685     {
3180 17 Mar 15 olle 1686       item = selItemsList[index];
3180 17 Mar 15 olle 1687     }
3180 17 Mar 15 olle 1688     else
3180 17 Mar 15 olle 1689     {
3180 17 Mar 15 olle 1690       // Extra QIAcube item
3180 17 Mar 15 olle 1691       item = extraItemsList[index - numItems];
3180 17 Mar 15 olle 1692     }
3176 06 Mar 15 olle 1693     var url = 'edit_dnarna_details.jsp?ID='+App.getSessionId();
3176 06 Mar 15 olle 1694     url += '&index='+index;
3176 06 Mar 15 olle 1695     url += '&mode=' + 'ExtractionReg';
3176 06 Mar 15 olle 1696     url += '&specimen=' + item.name;
3176 06 Mar 15 olle 1697     Dialogs.openPopup(url, 'EditDnaRnaDetails'+index, 750, 500);  
3176 06 Mar 15 olle 1698   }
3176 06 Mar 15 olle 1699
3176 06 Mar 15 olle 1700   exreg.nanoDropFileOnChange = function()
3176 06 Mar 15 olle 1701   {
3176 06 Mar 15 olle 1702     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 1703     var file = frm.nanoDropFile.files[0];
3176 06 Mar 15 olle 1704     
3176 06 Mar 15 olle 1705     var reader = new FileReader();
3176 06 Mar 15 olle 1706     reader.onload = exreg.nanoDropFileLoaded;
3176 06 Mar 15 olle 1707     reader.readAsText(file);
3176 06 Mar 15 olle 1708   }
3176 06 Mar 15 olle 1709
3176 06 Mar 15 olle 1710   exreg.nanoDropFileLoaded = function(event)
3176 06 Mar 15 olle 1711   {
3176 06 Mar 15 olle 1712     exreg.parseNanoDropFile(event.target.result);
3176 06 Mar 15 olle 1713   }
3176 06 Mar 15 olle 1714
3176 06 Mar 15 olle 1715
3176 06 Mar 15 olle 1716   exreg.parseNanoDropFile = function(data)
3176 06 Mar 15 olle 1717   {
3176 06 Mar 15 olle 1718     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 1719     nanoDropFileIsValid = false;
3176 06 Mar 15 olle 1720
3176 06 Mar 15 olle 1721     var numSpecimens = 0;
3176 06 Mar 15 olle 1722     try
3176 06 Mar 15 olle 1723     {
3176 06 Mar 15 olle 1724       // Reset the existing values
3176 06 Mar 15 olle 1725       
3176 06 Mar 15 olle 1726       // Get list of selected extract source items
3176 06 Mar 15 olle 1727       var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 1728       var numItems = selItemsList.length;
3176 06 Mar 15 olle 1729       var numNanoDropItems = 0;
3176 06 Mar 15 olle 1730       for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 1731       {
3176 06 Mar 15 olle 1732         var item = selItemsList[i];
3352 26 May 15 olle 1733         if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3176 06 Mar 15 olle 1734         {
3176 06 Mar 15 olle 1735           item.rna.ndConc = null;
3176 06 Mar 15 olle 1736           item.rna.nd260by280 = null;
3176 06 Mar 15 olle 1737           item.rna.nd260by230 = null;
3176 06 Mar 15 olle 1738           numNanoDropItems++;
3176 06 Mar 15 olle 1739         }
3176 06 Mar 15 olle 1740       }
3176 06 Mar 15 olle 1741       
3176 06 Mar 15 olle 1742       var lines = data.split(/[\n\r]+/);
3176 06 Mar 15 olle 1743       var columns = lines[0].split(/ *\t */);
3176 06 Mar 15 olle 1744       
3176 06 Mar 15 olle 1745       var sampleIndex = exreg.findColumn(columns, 'Sample ID');
3176 06 Mar 15 olle 1746       if (sampleIndex == -1) return;
3176 06 Mar 15 olle 1747       
3176 06 Mar 15 olle 1748       var wellIndex = exreg.findColumn(columns, 'Well');
3176 06 Mar 15 olle 1749       if (wellIndex == -1) return;
3176 06 Mar 15 olle 1750       
3176 06 Mar 15 olle 1751       var ndConcIndex = exreg.findColumn(columns, 'Conc.');
3176 06 Mar 15 olle 1752       if (ndConcIndex == -1) return;
3176 06 Mar 15 olle 1753       
3176 06 Mar 15 olle 1754       var nd260by280Index = exreg.findColumn(columns, '260/280');
3176 06 Mar 15 olle 1755       if (nd260by280Index == -1) return;
3176 06 Mar 15 olle 1756       
3176 06 Mar 15 olle 1757       var nd260by230Index = exreg.findColumn(columns, '260/230');
3176 06 Mar 15 olle 1758       if (nd260by230Index == -1) return;
3176 06 Mar 15 olle 1759     
3176 06 Mar 15 olle 1760       var numImported = 0;    
3176 06 Mar 15 olle 1761       for (var i = 1; i < lines.length; i++)
3176 06 Mar 15 olle 1762       {
3176 06 Mar 15 olle 1763         if (lines[i].match(/^\s*$/)) continue; // Ignore empty lines
3176 06 Mar 15 olle 1764         
3176 06 Mar 15 olle 1765         var row = lines[i].split(/ *\t */);
3176 06 Mar 15 olle 1766         if (row.length != columns.length) 
3176 06 Mar 15 olle 1767         {
3176 06 Mar 15 olle 1768           Wizard.setInputStatus('nanoDropFile', 'invalid', 'On line ' + (i+1) + '; Unexpected number of columns: ' + row.length);
3176 06 Mar 15 olle 1769           return;
3176 06 Mar 15 olle 1770         }
3227 07 Apr 15 olle 1771
3176 06 Mar 15 olle 1772         var sampleId = row[sampleIndex];
3176 06 Mar 15 olle 1773         if (!sampleId || sampleId == 'blank') continue; // with the next line
3176 06 Mar 15 olle 1774     
3227 07 Apr 15 olle 1775         var rnaOrDna = exreg.findRnaOrDna(sampleId, i+1, 'nanoDropFile');
3176 06 Mar 15 olle 1776         if (!rnaOrDna) return;  // This is an error condition
3176 06 Mar 15 olle 1777         
3335 13 May 15 olle 1778         if (rnaOrDna.nanoDropWell != row[wellIndex])
3176 06 Mar 15 olle 1779         {
3335 13 May 15 olle 1780           Wizard.setInputStatus('nanoDropFile', 'invalid', 'On line ' + (i+1) + '; Expected to find "' + sampleId + '" in well [' + rnaOrDna.nanoDropWell + '] not ['  + row[wellIndex] + ']');
3176 06 Mar 15 olle 1781           return;
3176 06 Mar 15 olle 1782         }
3176 06 Mar 15 olle 1783         
3352 26 May 15 olle 1784         var ndConc = ExtractUtils.getNumber(row[ndConcIndex]);
3176 06 Mar 15 olle 1785         if (isNaN(ndConc))
3176 06 Mar 15 olle 1786         {
3176 06 Mar 15 olle 1787           Wizard.setInputStatus('nanoDropFile', 'invalid', 'On line ' + (i+1) + '; No valid NDConc value for "' + sampleId + '": ' + row[ndConcIndex]);
3176 06 Mar 15 olle 1788           return;
3176 06 Mar 15 olle 1789         }
3176 06 Mar 15 olle 1790         
3176 06 Mar 15 olle 1791         // If there are multiple entries for the same item, keep the largest NDConc
3176 06 Mar 15 olle 1792         var isFirstValue = rnaOrDna.ndConc == null;
3176 06 Mar 15 olle 1793         if (isFirstValue || ndConc > rnaOrDna.ndConc)
3176 06 Mar 15 olle 1794         {
3352 26 May 15 olle 1795           var nd260by280 = ExtractUtils.getNumber(row[nd260by280Index]);
3176 06 Mar 15 olle 1796           if (isNaN(nd260by280))
3176 06 Mar 15 olle 1797           {
3176 06 Mar 15 olle 1798             Wizard.setInputStatus('nanoDropFile', 'invalid', 'On line ' + (i+1) + '; No valid 260/280 value for "' + sampleId + '": ' + row[nd260by280Index]);
3176 06 Mar 15 olle 1799             return;
3176 06 Mar 15 olle 1800           }
3176 06 Mar 15 olle 1801           
3352 26 May 15 olle 1802           var nd260by230 = ExtractUtils.getNumber(row[nd260by230Index]);
3176 06 Mar 15 olle 1803           if (isNaN(nd260by230))
3176 06 Mar 15 olle 1804           {
3176 06 Mar 15 olle 1805             Wizard.setInputStatus('nanoDropFile', 'invalid', 'On line ' + (i+1) + '; No valid 260/230 value for "' + sampleId + '": '+row[nd260by230Index]);
3176 06 Mar 15 olle 1806             return;
3176 06 Mar 15 olle 1807           }
3176 06 Mar 15 olle 1808           
3176 06 Mar 15 olle 1809           // Store values
3176 06 Mar 15 olle 1810           rnaOrDna.ndConc = ndConc;
3176 06 Mar 15 olle 1811           rnaOrDna.nd260by280 = nd260by280;
3176 06 Mar 15 olle 1812           rnaOrDna.nd260by230 = nd260by230;
3176 06 Mar 15 olle 1813
3176 06 Mar 15 olle 1814           // Only update counter for the first value (not when replacing a lower value)
3176 06 Mar 15 olle 1815           if (isFirstValue)
3176 06 Mar 15 olle 1816           {
3176 06 Mar 15 olle 1817             numImported++;
3176 06 Mar 15 olle 1818           }
3176 06 Mar 15 olle 1819         }
3176 06 Mar 15 olle 1820         
3176 06 Mar 15 olle 1821       }
3176 06 Mar 15 olle 1822
3176 06 Mar 15 olle 1823       if (numImported != numNanoDropItems)
3176 06 Mar 15 olle 1824       {
3176 06 Mar 15 olle 1825         Wizard.setInputStatus('nanoDropFile', 'invalid', 'Could not find NanoDrop values for all ' + numNanoDropItems + ' samples: ' + numImported);
3176 06 Mar 15 olle 1826         return;
3176 06 Mar 15 olle 1827       }
3176 06 Mar 15 olle 1828
3176 06 Mar 15 olle 1829       Wizard.setInputStatus('nanoDropFile', 'valid');
3176 06 Mar 15 olle 1830       nanoDropFileIsValid = true;
3176 06 Mar 15 olle 1831     }
3176 06 Mar 15 olle 1832     finally
3176 06 Mar 15 olle 1833     {
3176 06 Mar 15 olle 1834       exreg.updateDetailsTable();
3176 06 Mar 15 olle 1835     }
3176 06 Mar 15 olle 1836   }
3176 06 Mar 15 olle 1837
3176 06 Mar 15 olle 1838   exreg.qubitFileOnChange = function()
3176 06 Mar 15 olle 1839   {
3176 06 Mar 15 olle 1840     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 1841     var file = frm.qubitFile.files[0];
3176 06 Mar 15 olle 1842     
3176 06 Mar 15 olle 1843     var reader = new FileReader();
3176 06 Mar 15 olle 1844     reader.onload = exreg.qubitFileLoaded;
3694 15 Jan 16 olle 1845     // Read with encoding "ISO-8859-1" to ensure that special characters will be correct
3694 15 Jan 16 olle 1846     reader.readAsText(file, 'ISO-8859-1');
3176 06 Mar 15 olle 1847   }
3176 06 Mar 15 olle 1848
3283 29 Apr 15 olle 1849   exreg.qubitFileDilutionFactorOnChange = function()
3283 29 Apr 15 olle 1850   {
3283 29 Apr 15 olle 1851     var frm = document.forms['meludi'];
3283 29 Apr 15 olle 1852     var dilutionFactor = frm.qubitFileDilutionFactor.value;
3352 26 May 15 olle 1853     dilutionFactor = ExtractUtils.getNumber(dilutionFactor);    
3283 29 Apr 15 olle 1854
3283 29 Apr 15 olle 1855     if (isNaN(dilutionFactor))
3283 29 Apr 15 olle 1856     {
3283 29 Apr 15 olle 1857       Wizard.setInputStatus('qubitFileDilutionFactor', 'invalid', 'Dilution factor must be a number.');
3283 29 Apr 15 olle 1858       return;
3283 29 Apr 15 olle 1859     }
3283 29 Apr 15 olle 1860     else if (dilutionFactor <= 0)
3283 29 Apr 15 olle 1861     {
3283 29 Apr 15 olle 1862       Wizard.setInputStatus('qubitFileDilutionFactor', 'invalid', 'Dilution factor must be >= 0.');
3283 29 Apr 15 olle 1863       return;
3283 29 Apr 15 olle 1864     }
3283 29 Apr 15 olle 1865     frm.qubitFileDilutionFactor.value = dilutionFactor;
3283 29 Apr 15 olle 1866     Wizard.setInputStatus('qubitFileDilutionFactor', 'valid');
3283 29 Apr 15 olle 1867   }
3283 29 Apr 15 olle 1868
3176 06 Mar 15 olle 1869   exreg.qubitFileLoaded = function(event)
3176 06 Mar 15 olle 1870   {
3176 06 Mar 15 olle 1871     exreg.parseQubitFile(event.target.result);
3176 06 Mar 15 olle 1872   }
3176 06 Mar 15 olle 1873
3176 06 Mar 15 olle 1874   exreg.parseQubitFile = function(data)
3176 06 Mar 15 olle 1875   {
3176 06 Mar 15 olle 1876     var frm = document.forms['meludi'];
3283 29 Apr 15 olle 1877     var dilutionFactorDefault = frm.qubitFileDilutionFactor.value;
3176 06 Mar 15 olle 1878     qubitFileIsValid = false;
3176 06 Mar 15 olle 1879
3176 06 Mar 15 olle 1880     var numSpecimens = 0;
3176 06 Mar 15 olle 1881     try
3176 06 Mar 15 olle 1882     {
3176 06 Mar 15 olle 1883       // Reset the existing values
3176 06 Mar 15 olle 1884       
3176 06 Mar 15 olle 1885       // Get list of selected extract source items
3176 06 Mar 15 olle 1886       var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 1887       var numItems = selItemsList.length;
3176 06 Mar 15 olle 1888       var qubitItemsList = [];
3176 06 Mar 15 olle 1889       var numQubitItems = 0;
3208 24 Mar 15 olle 1890       var qubitFileInfoText = null;
3176 06 Mar 15 olle 1891       // Reset existing values, if not explicitly entered in input field
3176 06 Mar 15 olle 1892       for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 1893       {
3176 06 Mar 15 olle 1894         var item = selItemsList[i];
3352 26 May 15 olle 1895         if (ExtractUtils.isSpecimen(item) || ExtractUtils.isDna(item))
3176 06 Mar 15 olle 1896         {
3176 06 Mar 15 olle 1897           var dnaConc = frm['dnaConc'+i];
3176 06 Mar 15 olle 1898           if (dnaConc != null)
3176 06 Mar 15 olle 1899           {
3176 06 Mar 15 olle 1900             var dnaConcValue = frm['dnaConc'+i].value;
3176 06 Mar 15 olle 1901             if (dnaConcValue != null && dnaConcValue != '' && dnaConcValue != '-')
3176 06 Mar 15 olle 1902             {
3352 26 May 15 olle 1903               item.dna.qubitConc = ExtractUtils.getNumber(dnaConcValue);
3176 06 Mar 15 olle 1904             }
3176 06 Mar 15 olle 1905             else
3176 06 Mar 15 olle 1906             {
3176 06 Mar 15 olle 1907               item.dna.qubitConc = null;
3176 06 Mar 15 olle 1908               item.dna.nd260by280 = null;
3176 06 Mar 15 olle 1909               item.dna.nd260by230 = null;
3176 06 Mar 15 olle 1910             }
3176 06 Mar 15 olle 1911           }
3176 06 Mar 15 olle 1912           else
3176 06 Mar 15 olle 1913           {
3176 06 Mar 15 olle 1914             item.dna.qubitConc = null;
3176 06 Mar 15 olle 1915             item.dna.nd260by280 = null;
3176 06 Mar 15 olle 1916             item.dna.nd260by230 = null;
3176 06 Mar 15 olle 1917           }
3176 06 Mar 15 olle 1918           qubitItemsList[numQubitItems] = item;
3176 06 Mar 15 olle 1919           numQubitItems++;
3176 06 Mar 15 olle 1920         }
3176 06 Mar 15 olle 1921       }
3176 06 Mar 15 olle 1922       
3694 15 Jan 16 olle 1923       // Replace double quotes with blanks
3694 15 Jan 16 olle 1924       var lines = [];
3694 15 Jan 16 olle 1925       var rawLines = data.split(/[\n\r]+/);
3694 15 Jan 16 olle 1926       for (i = 0; i < rawLines.length; i++)
3694 15 Jan 16 olle 1927       {
3694 15 Jan 16 olle 1928         var rawLine = rawLines[i];
3694 15 Jan 16 olle 1929         var line = rawLine.replace(/\"/g, "");
3694 15 Jan 16 olle 1930         lines[i] = line;
3694 15 Jan 16 olle 1931       }
3694 15 Jan 16 olle 1932       // Inspect header line to get header version
3694 15 Jan 16 olle 1933       var headerVersion = exreg.fetchQubitFileHeaderVersion(lines[0]);
3694 15 Jan 16 olle 1934       if (headerVersion == null)
3694 15 Jan 16 olle 1935       {
3694 15 Jan 16 olle 1936         Wizard.setInputStatus('qubitFile', 'invalid', 'Unknown Qubit file header version');
3694 15 Jan 16 olle 1937         return;
3694 15 Jan 16 olle 1938       }
3176 06 Mar 15 olle 1939       //var columns = lines[0].split(/ *\t */);
3176 06 Mar 15 olle 1940       var columns = lines[0].split(/ *, */);
3176 06 Mar 15 olle 1941       
3694 15 Jan 16 olle 1942       var nameHeader = exreg.fetchQubitFileColumnName('name', headerVersion);
3694 15 Jan 16 olle 1943       var nameIndex = exreg.findColumn(columns, nameHeader);
3176 06 Mar 15 olle 1944       if (nameIndex == -1) return;
3176 06 Mar 15 olle 1945       
3694 15 Jan 16 olle 1946       var assayConcHeader = exreg.fetchQubitFileColumnName('conc', headerVersion);
3694 15 Jan 16 olle 1947       var assayConcIndex = exreg.findColumn(columns, assayConcHeader);
3176 06 Mar 15 olle 1948       if (assayConcIndex == -1) return;
3176 06 Mar 15 olle 1949       
3694 15 Jan 16 olle 1950       var unitsHeader = exreg.fetchQubitFileColumnName('units', headerVersion);
3694 15 Jan 16 olle 1951       var unitsIndex = exreg.findColumn(columns, unitsHeader);
3176 06 Mar 15 olle 1952       if (unitsIndex == -1) return;
3176 06 Mar 15 olle 1953
3694 15 Jan 16 olle 1954       var dilutionFactorHeader = exreg.fetchQubitFileColumnName('dilutionFactor', headerVersion);
3694 15 Jan 16 olle 1955       var dilutionFactorIndex = exreg.findColumn(columns, dilutionFactorHeader);
3208 24 Mar 15 olle 1956       if (dilutionFactorIndex == -1) return;
3208 24 Mar 15 olle 1957       
3176 06 Mar 15 olle 1958       // Entry lines come in reversed chronological order
3176 06 Mar 15 olle 1959       var qubitConcReversedList = [];
3176 06 Mar 15 olle 1960       var numConcValues = 0;
3176 06 Mar 15 olle 1961       for (var i = 1; i < lines.length; i++)
3176 06 Mar 15 olle 1962       {
3176 06 Mar 15 olle 1963         if (lines[i].match(/^\s*$/)) continue; // Ignore empty lines
3176 06 Mar 15 olle 1964         
3176 06 Mar 15 olle 1965         //var row = lines[i].split(/ *\t */);
3176 06 Mar 15 olle 1966         var row = lines[i].split(/ *, */);
3176 06 Mar 15 olle 1967         if (row.length != columns.length) 
3176 06 Mar 15 olle 1968         {
3176 06 Mar 15 olle 1969           Wizard.setInputStatus('qubitFile', 'invalid', 'On line ' + (i+1) + '; Unexpected number of columns: ' + row.length);
3176 06 Mar 15 olle 1970           return;
3176 06 Mar 15 olle 1971         }
3176 06 Mar 15 olle 1972         
3176 06 Mar 15 olle 1973         var sampleName = row[nameIndex];
3176 06 Mar 15 olle 1974         if (!sampleName) continue; // with the next line if sample name missing
3176 06 Mar 15 olle 1975     
3176 06 Mar 15 olle 1976         var assayConc = row[assayConcIndex];
3176 06 Mar 15 olle 1977         var units = row[unitsIndex];
3208 24 Mar 15 olle 1978         var dilutionFactor = row[dilutionFactorIndex];
3268 23 Apr 15 olle 1979         //
3268 23 Apr 15 olle 1980         // Note: Up to this point, input variables are of type string.
3268 23 Apr 15 olle 1981         // If the value represents a number, the variable needs to be
3268 23 Apr 15 olle 1982         // converted to type number, which is important e.g. when calling
3268 23 Apr 15 olle 1983         // function toFixed(numDecimals), which is defined for numbers, but not for strings.
3268 23 Apr 15 olle 1984         //
3268 23 Apr 15 olle 1985         if (assayConc != null && !isNaN(assayConc))
3268 23 Apr 15 olle 1986         {
3352 26 May 15 olle 1987           assayConc = ExtractUtils.getNumber(assayConc);
3268 23 Apr 15 olle 1988         }
3268 23 Apr 15 olle 1989
3208 24 Mar 15 olle 1990         if (dilutionFactor == null || dilutionFactor == '')
3208 24 Mar 15 olle 1991         {
3283 29 Apr 15 olle 1992           dilutionFactor = dilutionFactorDefault;
3208 24 Mar 15 olle 1993         }
3208 24 Mar 15 olle 1994
3268 23 Apr 15 olle 1995         if (!isNaN(assayConc))
3268 23 Apr 15 olle 1996         {
3268 23 Apr 15 olle 1997           // Multiply with dilution factor
3268 23 Apr 15 olle 1998           assayConc *= dilutionFactor;
3268 23 Apr 15 olle 1999         }
3176 06 Mar 15 olle 2000         if (assayConc && units && units == 'ng/ml')
3176 06 Mar 15 olle 2001         {
3208 24 Mar 15 olle 2002           if (!isNaN(assayConc))
3176 06 Mar 15 olle 2003           {
3268 23 Apr 15 olle 2004             // Convert to ng/microliter = microgram/milliliter
3208 24 Mar 15 olle 2005             assayConc /= 1000.0;
3176 06 Mar 15 olle 2006           }
3176 06 Mar 15 olle 2007         }
3176 06 Mar 15 olle 2008
3176 06 Mar 15 olle 2009         if (assayConc)
3176 06 Mar 15 olle 2010         {
3176 06 Mar 15 olle 2011           qubitConcReversedList[numConcValues] = assayConc;
3176 06 Mar 15 olle 2012           numConcValues++;
3176 06 Mar 15 olle 2013         }      
3176 06 Mar 15 olle 2014       }
3176 06 Mar 15 olle 2015           
3176 06 Mar 15 olle 2016       // Reverse list to get values in correct order
3176 06 Mar 15 olle 2017       var qubitConcList = [];
3176 06 Mar 15 olle 2018       for (var i = 0; i < numConcValues; i++)
3176 06 Mar 15 olle 2019       {
3176 06 Mar 15 olle 2020         qubitConcList[i] = qubitConcReversedList[(numConcValues - 1) - i];
3176 06 Mar 15 olle 2021       }
3176 06 Mar 15 olle 2022
3176 06 Mar 15 olle 2023       var numImported = 0;
3176 06 Mar 15 olle 2024       var qubitConcIndex = 0;  
3176 06 Mar 15 olle 2025       for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 2026       {
3176 06 Mar 15 olle 2027         var item = selItemsList[i];
3352 26 May 15 olle 2028         if (ExtractUtils.isSpecimen(item) || ExtractUtils.isDna(item))
3176 06 Mar 15 olle 2029         {
3176 06 Mar 15 olle 2030           var qubitConc = qubitConcList[qubitConcIndex];
3176 06 Mar 15 olle 2031           if (isNaN(qubitConc))
3176 06 Mar 15 olle 2032           {
3208 24 Mar 15 olle 2033             // This case is often "<0.50" (assay concentration < 0.50 ng/ml excluding dilution)
3208 24 Mar 15 olle 2034             var qubitItem = qubitItemsList[qubitConcIndex];
3208 24 Mar 15 olle 2035 /*
3208 24 Mar 15 olle 2036             Wizard.setInputStatus('qubitFile', 'invalid', 'On line ' + (i+1) + ': No valid Assay Conc value for "' + qubitItem.name + '": ' + qubitConc);
3176 06 Mar 15 olle 2037             return;
3208 24 Mar 15 olle 2038 */
3208 24 Mar 15 olle 2039             qubitFileInfoText = 'Assay conc. value for "' + qubitItem.name + '": ' + qubitConc + ' set to 0.0.';
3208 24 Mar 15 olle 2040             qubitConc = 0.0;
3176 06 Mar 15 olle 2041           }
3208 24 Mar 15 olle 2042           qubitConcIndex++;
3176 06 Mar 15 olle 2043           numImported++;
3176 06 Mar 15 olle 2044
3176 06 Mar 15 olle 2045           var dnaConc = frm['dnaConc'+i];
3176 06 Mar 15 olle 2046           if (dnaConc != null)
3176 06 Mar 15 olle 2047           {
3176 06 Mar 15 olle 2048             var dnaConcValue = frm['dnaConc'+i].value;
3176 06 Mar 15 olle 2049             if (dnaConcValue != null && dnaConcValue != '' && dnaConcValue != '-')
3176 06 Mar 15 olle 2050             {
3352 26 May 15 olle 2051               item.dna.qubitConc = ExtractUtils.getNumber(dnaConcValue);
3176 06 Mar 15 olle 2052             }
3176 06 Mar 15 olle 2053             else
3176 06 Mar 15 olle 2054             {
3176 06 Mar 15 olle 2055               item.dna.qubitConc = qubitConc;
3176 06 Mar 15 olle 2056             }
3176 06 Mar 15 olle 2057           }
3176 06 Mar 15 olle 2058           else
3176 06 Mar 15 olle 2059           {
3176 06 Mar 15 olle 2060             item.dna.qubitConc = qubitConc;
3176 06 Mar 15 olle 2061           }
3176 06 Mar 15 olle 2062         }
3176 06 Mar 15 olle 2063       }
3176 06 Mar 15 olle 2064
3176 06 Mar 15 olle 2065       if (numImported != numQubitItems)
3176 06 Mar 15 olle 2066       {
3176 06 Mar 15 olle 2067         Wizard.setInputStatus('qubitFile', 'invalid', 'Could not find Qubit values for all ' + numQubitItems + ' samples: ' + numImported);
3176 06 Mar 15 olle 2068         return;
3176 06 Mar 15 olle 2069       }
3176 06 Mar 15 olle 2070
3208 24 Mar 15 olle 2071       if (qubitFileInfoText)
3208 24 Mar 15 olle 2072       {
3208 24 Mar 15 olle 2073         Wizard.setInputStatus('qubitFile', 'flag', qubitFileInfoText);
3208 24 Mar 15 olle 2074       }
3208 24 Mar 15 olle 2075       else
3208 24 Mar 15 olle 2076       {
3208 24 Mar 15 olle 2077         Wizard.setInputStatus('qubitFile', 'valid');
3208 24 Mar 15 olle 2078       }
3176 06 Mar 15 olle 2079       qubitFileIsValid = true;
3176 06 Mar 15 olle 2080     }
3176 06 Mar 15 olle 2081     finally
3176 06 Mar 15 olle 2082     {
3176 06 Mar 15 olle 2083       exreg.updateDetailsTable();
3176 06 Mar 15 olle 2084     }
3176 06 Mar 15 olle 2085   }
3176 06 Mar 15 olle 2086
3694 15 Jan 16 olle 2087   /**
3694 15 Jan 16 olle 2088    * Returns a local Qubit file header version number
3694 15 Jan 16 olle 2089    * after inspection of the header line, or `null` if unknown.
3694 15 Jan 16 olle 2090    * The version number is only used locally, but was chosen
3694 15 Jan 16 olle 2091    * to coincide with Qubit hardware versions 2 and 3.
3694 15 Jan 16 olle 2092    *
3694 15 Jan 16 olle 2093    * @param header The header line with column names.
3694 15 Jan 16 olle 2094    * @return The Qubit file header version number, or `null` if unknown. 
3694 15 Jan 16 olle 2095    */
3694 15 Jan 16 olle 2096   exreg.fetchQubitFileHeaderVersion = function(header)
3694 15 Jan 16 olle 2097   {
3694 15 Jan 16 olle 2098     var headerVersion = null;
3694 15 Jan 16 olle 2099     if (header.indexOf('Assay Conc.') >= 0)
3694 15 Jan 16 olle 2100     {
3694 15 Jan 16 olle 2101       headerVersion = 2;
3694 15 Jan 16 olle 2102     }
3694 15 Jan 16 olle 2103     else if (header.indexOf('Qubit® tube conc.') >= 0)
3694 15 Jan 16 olle 2104     {
3694 15 Jan 16 olle 2105       headerVersion = 3;
3694 15 Jan 16 olle 2106     }
3694 15 Jan 16 olle 2107     return headerVersion;
3694 15 Jan 16 olle 2108   }
3694 15 Jan 16 olle 2109
3694 15 Jan 16 olle 2110   /**
3694 15 Jan 16 olle 2111    * Returns a column name in header of Qubit file
3694 15 Jan 16 olle 2112    * after input of JSON key value for the column
3694 15 Jan 16 olle 2113    * and local Qubit file header version number,
3694 15 Jan 16 olle 2114    * or `null` if unknown.
3694 15 Jan 16 olle 2115    *
3694 15 Jan 16 olle 2116    * @param key JSON key value for Qubit file column.
3694 15 Jan 16 olle 2117    * @param headerVersion Local Qubit file header version number.
3694 15 Jan 16 olle 2118    * @return Column name in header of Qubit file, or `null` if unknown. 
3694 15 Jan 16 olle 2119    */
3694 15 Jan 16 olle 2120   exreg.fetchQubitFileColumnName = function(key, headerVersion)
3694 15 Jan 16 olle 2121   {
3694 15 Jan 16 olle 2122     var jsonQubitFileColumnHeaders2 = {"name": "Name", "conc": "Assay Conc.", "units": "Units", "dilutionFactor": "Dilution Factor"};
3694 15 Jan 16 olle 2123     var jsonQubitFileColumnHeaders3 = {"name": "Assay Name", "conc": "Qubit® tube conc.", "units": "Units", "dilutionFactor": "Dilution Factor"};
3694 15 Jan 16 olle 2124
3694 15 Jan 16 olle 2125     var columnName = null;
3694 15 Jan 16 olle 2126     if (headerVersion == 2)
3694 15 Jan 16 olle 2127     {
3694 15 Jan 16 olle 2128       columnName = jsonQubitFileColumnHeaders2[key];
3694 15 Jan 16 olle 2129     }
3694 15 Jan 16 olle 2130     else if (headerVersion == 3)
3694 15 Jan 16 olle 2131     {
3694 15 Jan 16 olle 2132       columnName = jsonQubitFileColumnHeaders3[key];
3694 15 Jan 16 olle 2133     }
3694 15 Jan 16 olle 2134     return columnName;
3694 15 Jan 16 olle 2135   }
3694 15 Jan 16 olle 2136
3176 06 Mar 15 olle 2137   exreg.parseDnaInput = function(data)
3176 06 Mar 15 olle 2138   {
3176 06 Mar 15 olle 2139     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 2140     qubitFileIsValid = false;
3176 06 Mar 15 olle 2141
3208 24 Mar 15 olle 2142     var numQubitItems = 0;
3176 06 Mar 15 olle 2143     try
3176 06 Mar 15 olle 2144     {
3176 06 Mar 15 olle 2145       // Get list of selected extract source items
3176 06 Mar 15 olle 2146       var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 2147       var numItems = selItemsList.length;
3176 06 Mar 15 olle 2148
3176 06 Mar 15 olle 2149       // Reset the existing values
3176 06 Mar 15 olle 2150       for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 2151       {
3176 06 Mar 15 olle 2152         var item = selItemsList[i];
3176 06 Mar 15 olle 2153         var dnaConc = frm['dnaConc'+i];
3176 06 Mar 15 olle 2154         if (dnaConc != null)
3176 06 Mar 15 olle 2155         {
3176 06 Mar 15 olle 2156           var dnaConcValue = frm['dnaConc'+i].value;
3176 06 Mar 15 olle 2157           if (dnaConcValue != null && dnaConcValue != '' && dnaConcValue != '-')
3176 06 Mar 15 olle 2158           {
3352 26 May 15 olle 2159             item.dna.qubitConc = ExtractUtils.getNumber(dnaConcValue);
3176 06 Mar 15 olle 2160           }
3176 06 Mar 15 olle 2161           else
3176 06 Mar 15 olle 2162           {
3176 06 Mar 15 olle 2163             item.dna.qubitConc = null;
3176 06 Mar 15 olle 2164           }
3208 24 Mar 15 olle 2165           numQubitItems++;
3176 06 Mar 15 olle 2166         }
3176 06 Mar 15 olle 2167         else
3176 06 Mar 15 olle 2168         {
3176 06 Mar 15 olle 2169           item.dna.qubitConc = null;
3176 06 Mar 15 olle 2170         }
3176 06 Mar 15 olle 2171       }
3176 06 Mar 15 olle 2172       
3176 06 Mar 15 olle 2173       var lines = data.split(/[\n\r]+/);
3176 06 Mar 15 olle 2174       var columns = lines[0].split(/ *\t */);
3176 06 Mar 15 olle 2175       
3176 06 Mar 15 olle 2176       var sampleIndex = exreg.findColumn(columns, 'Sample ID');
3176 06 Mar 15 olle 2177       if (sampleIndex == -1) return;
3176 06 Mar 15 olle 2178       
3176 06 Mar 15 olle 2179       var wellIndex = exreg.findColumn(columns, 'Well');
3176 06 Mar 15 olle 2180       if (wellIndex == -1) return;
3176 06 Mar 15 olle 2181       
3176 06 Mar 15 olle 2182       var qubitConcIndex = exreg.findColumn(columns, 'Conc.');
3176 06 Mar 15 olle 2183       if (qubitConcIndex == -1) return;
3176 06 Mar 15 olle 2184       
3176 06 Mar 15 olle 2185       var numImported = 0;    
3176 06 Mar 15 olle 2186       for (var i = 1; i < lines.length; i++)
3176 06 Mar 15 olle 2187       {
3176 06 Mar 15 olle 2188         if (lines[i].match(/^\s*$/)) continue; // Ignore empty lines
3176 06 Mar 15 olle 2189         
3176 06 Mar 15 olle 2190         var row = lines[i].split(/ *\t */);
3176 06 Mar 15 olle 2191         if (row.length != columns.length) 
3176 06 Mar 15 olle 2192         {
3176 06 Mar 15 olle 2193           Wizard.setInputStatus('qubitFile', 'invalid', 'On line ' + (i+1) + '; Unexpected number of columns: ' + row.length);
3176 06 Mar 15 olle 2194           return;
3176 06 Mar 15 olle 2195         }
3176 06 Mar 15 olle 2196         
3176 06 Mar 15 olle 2197         var sampleId = row[sampleIndex];
3176 06 Mar 15 olle 2198         if (!sampleId || sampleId == 'blank') continue; // with the next line
3176 06 Mar 15 olle 2199     
3227 07 Apr 15 olle 2200         var rnaOrDna = exreg.findRnaOrDna(sampleId, i+1, 'qubitFile');
3176 06 Mar 15 olle 2201         if (!rnaOrDna) return;  // This is an error condition
3176 06 Mar 15 olle 2202
3176 06 Mar 15 olle 2203         // No check for correct well since DNA is not stored on plate
3176 06 Mar 15 olle 2204
3352 26 May 15 olle 2205         var qubitConc = ExtractUtils.getNumber(row[qubitConcIndex]);
3176 06 Mar 15 olle 2206         if (isNaN(qubitConc))
3176 06 Mar 15 olle 2207         {
3227 07 Apr 15 olle 2208           Wizard.setInputStatus('qubitFile', 'invalid', 'On line ' + (i+1) + '; No valid qubitConc value for "' + sampleId + '": ' + row[qubitConcIndex]);
3176 06 Mar 15 olle 2209           return;
3176 06 Mar 15 olle 2210         }
3176 06 Mar 15 olle 2211         
3176 06 Mar 15 olle 2212         // If there are multiple entries for the same item, keep the largest QubitConc
3227 07 Apr 15 olle 2213         var isFirstValue = rnaOrDna.qubitConc == null;
3227 07 Apr 15 olle 2214         if (isFirstValue || qubitConc > rnaOrDna.qubitConc)
3176 06 Mar 15 olle 2215         {
3176 06 Mar 15 olle 2216           // Store values
3227 07 Apr 15 olle 2217           if (rnaOrDna.qubitConc == null || rnaOrDna.qubitConc == '')
3176 06 Mar 15 olle 2218           {
3227 07 Apr 15 olle 2219             rnaOrDna.qubitConc = qubitConc;
3176 06 Mar 15 olle 2220             isFirstValue = false;
3176 06 Mar 15 olle 2221           }
3176 06 Mar 15 olle 2222
3176 06 Mar 15 olle 2223           // Only update counter for the first value (not when replacing a lower value)
3176 06 Mar 15 olle 2224           if (isFirstValue)
3176 06 Mar 15 olle 2225           {
3176 06 Mar 15 olle 2226             numImported++;
3176 06 Mar 15 olle 2227           }
3176 06 Mar 15 olle 2228         }
3176 06 Mar 15 olle 2229         
3176 06 Mar 15 olle 2230       }
3176 06 Mar 15 olle 2231
3176 06 Mar 15 olle 2232 /*
3176 06 Mar 15 olle 2233       if (numImported != numSpecimens)
3176 06 Mar 15 olle 2234       {
3176 06 Mar 15 olle 2235         Wizard.setInputStatus('qubitFile', 'invalid', 'Could not find values for all ' + numSpecimens + ' samples: ' + numImported);
3176 06 Mar 15 olle 2236         return;
3176 06 Mar 15 olle 2237       }
3176 06 Mar 15 olle 2238 */
3176 06 Mar 15 olle 2239 /*
3176 06 Mar 15 olle 2240       Wizard.setInputStatus('qubitFile', 'valid');
3176 06 Mar 15 olle 2241       qubitFileIsValid = true;
3176 06 Mar 15 olle 2242 */
3176 06 Mar 15 olle 2243     }
3176 06 Mar 15 olle 2244     finally
3176 06 Mar 15 olle 2245     {
3176 06 Mar 15 olle 2246       exreg.updateDetailsTable();
3176 06 Mar 15 olle 2247     }
3176 06 Mar 15 olle 2248   }
3176 06 Mar 15 olle 2249
3176 06 Mar 15 olle 2250   exreg.findColumn = function(columns, col)
3176 06 Mar 15 olle 2251   {
3176 06 Mar 15 olle 2252     var colIndex = columns.indexOf(col);
3176 06 Mar 15 olle 2253     if (colIndex == -1)
3176 06 Mar 15 olle 2254     {
3176 06 Mar 15 olle 2255       Wizard.setInputStatus('nanoDropFile', 'invalid', 'On line 1; Can\'t find "' + col + '" column');
3176 06 Mar 15 olle 2256     }
3176 06 Mar 15 olle 2257     return colIndex;
3176 06 Mar 15 olle 2258   }
3176 06 Mar 15 olle 2259
3176 06 Mar 15 olle 2260   exreg.qPcrFileOnChange = function()
3176 06 Mar 15 olle 2261   {
3176 06 Mar 15 olle 2262     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 2263     var file = frm.qPcrFile.files[0];
3176 06 Mar 15 olle 2264     
3176 06 Mar 15 olle 2265     var reader = new FileReader();
3176 06 Mar 15 olle 2266     reader.onload = exreg.qPcrFileLoaded;
3176 06 Mar 15 olle 2267     reader.readAsText(file);
3176 06 Mar 15 olle 2268   }
3176 06 Mar 15 olle 2269
3176 06 Mar 15 olle 2270   exreg.qPcrFileLoaded = function(event)
3176 06 Mar 15 olle 2271   {
3176 06 Mar 15 olle 2272     exreg.parseQPcrFile(event.target.result);
3176 06 Mar 15 olle 2273   }
3176 06 Mar 15 olle 2274
3176 06 Mar 15 olle 2275   exreg.parseQPcrFile = function(data)
3176 06 Mar 15 olle 2276   {
3176 06 Mar 15 olle 2277     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 2278     qPcrFileIsValid = false;
3271 23 Apr 15 olle 2279     var qPcrFileInfoText = null;
3176 06 Mar 15 olle 2280
3176 06 Mar 15 olle 2281     var numQPcrItems = 0;
3176 06 Mar 15 olle 2282     try
3176 06 Mar 15 olle 2283     {
3176 06 Mar 15 olle 2284       // Reset the existing values
3176 06 Mar 15 olle 2285       
3176 06 Mar 15 olle 2286       // Get list of selected extract source items
3176 06 Mar 15 olle 2287       var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 2288       var numItems = selItemsList.length;
3176 06 Mar 15 olle 2289       for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 2290       {
3176 06 Mar 15 olle 2291         var item = selItemsList[i];
3352 26 May 15 olle 2292         if (ExtractUtils.isSpecimen(item) || ExtractUtils.isDna(item))
3176 06 Mar 15 olle 2293         {
3176 06 Mar 15 olle 2294           item.dna.deltaCt = null;
3176 06 Mar 15 olle 2295           numQPcrItems++;
3176 06 Mar 15 olle 2296         }
3176 06 Mar 15 olle 2297       }
3176 06 Mar 15 olle 2298
3176 06 Mar 15 olle 2299       // Find column separator as first character after first occurrence of search string
3352 26 May 15 olle 2300       var separator = ExtractUtils.findSeparator(data, "Well");
3176 06 Mar 15 olle 2301       if (separator == null)
3176 06 Mar 15 olle 2302       {
3176 06 Mar 15 olle 2303         // Comma is default separator
3176 06 Mar 15 olle 2304         separator = ',';
3176 06 Mar 15 olle 2305       }
3176 06 Mar 15 olle 2306       var columnSplitRegexp = new RegExp(" *" + separator + " *",'');
3176 06 Mar 15 olle 2307       var lines = data.split(/[\n\r]+/);
3176 06 Mar 15 olle 2308       //var columns = lines[0].split(/ *\t */);
3176 06 Mar 15 olle 2309       //var columns = lines[0].split(/ *, */);
3176 06 Mar 15 olle 2310       //var columns = lines[0].split(/ *; */);
3176 06 Mar 15 olle 2311       var columns = lines[0].split(columnSplitRegexp);
3176 06 Mar 15 olle 2312       
3176 06 Mar 15 olle 2313       var sampleIndex = exreg.findQPcrColumn(columns, 'Sample');
3176 06 Mar 15 olle 2314       if (sampleIndex == -1) return;
3176 06 Mar 15 olle 2315       var deltaCtIndex = exreg.findQPcrColumn(columns, 'Delta Ct');
3176 06 Mar 15 olle 2316       if (deltaCtIndex == -1) return;
3176 06 Mar 15 olle 2317
3176 06 Mar 15 olle 2318       var numImported = 0;    
3176 06 Mar 15 olle 2319       for (var i = 1; i < lines.length; i++)
3176 06 Mar 15 olle 2320       {
3176 06 Mar 15 olle 2321         if (lines[i].match(/^\s*$/)) continue; // Ignore empty lines
3176 06 Mar 15 olle 2322         //var row = lines[i].split(/ *\t */);
3176 06 Mar 15 olle 2323         //var row = lines[i].split(/ *, */);
3176 06 Mar 15 olle 2324         // Exchange decimal comma for decimal dot inside double quotes
3352 26 May 15 olle 2325         var procLine = ExtractUtils.setDecimalDotInsideDoubleQuotes(lines[i]);
3176 06 Mar 15 olle 2326         //var row = procLine.split(/ *, */);
3176 06 Mar 15 olle 2327         //var row = procLine.split(/ *; */);
3176 06 Mar 15 olle 2328         var row = procLine.split(columnSplitRegexp);
3176 06 Mar 15 olle 2329         if (row.length != columns.length) 
3176 06 Mar 15 olle 2330         {
3176 06 Mar 15 olle 2331           Wizard.setInputStatus('qPcrFile', 'invalid', 'On line ' + (i+1) + '; Unexpected number of columns: ' + row.length + " instead of " + columns.length);
3176 06 Mar 15 olle 2332           return;
3176 06 Mar 15 olle 2333         }
3176 06 Mar 15 olle 2334         
3176 06 Mar 15 olle 2335         var sampleId = row[sampleIndex];
3176 06 Mar 15 olle 2336         if (!sampleId || sampleId == 'blank' || sampleId == '' || sampleId == 'QCT') continue; // with the next line
3176 06 Mar 15 olle 2337     
3271 23 Apr 15 olle 2338         //var messageId = 'qPcrFile';
3271 23 Apr 15 olle 2339         var messageId = null;
3271 23 Apr 15 olle 2340         var rnaOrDna = exreg.findRnaOrDna(sampleId, i+1, messageId);
3271 23 Apr 15 olle 2341         if (!rnaOrDna)
3271 23 Apr 15 olle 2342         {
3271 23 Apr 15 olle 2343           // No RNA/DNA found with sample ID
3271 23 Apr 15 olle 2344           qPcrFileInfoText = 'On line ' + (i+1) + '; Can\'t find RNA/DNA with name "' + sampleId + '"';
3271 23 Apr 15 olle 2345           // Continue with the next line
3271 23 Apr 15 olle 2346           continue;
3271 23 Apr 15 olle 2347         }
3176 06 Mar 15 olle 2348 /*        
3176 06 Mar 15 olle 2349         if (rnaOrDna.well != row[wellIndex])
3176 06 Mar 15 olle 2350         {
3176 06 Mar 15 olle 2351           Wizard.setInputStatus('qPcrFile', 'invalid', 'On line ' + (i+1) + '; Expected to find "' + sampleId + '" in well [' + rnaOrDna.well + '] not ['  + row[wellIndex] + ']');
3176 06 Mar 15 olle 2352           return;
3176 06 Mar 15 olle 2353         }
3176 06 Mar 15 olle 2354 */      
3176 06 Mar 15 olle 2355         var isFirstValue = rnaOrDna.deltaCt == null;
3176 06 Mar 15 olle 2356         if (isFirstValue)
3176 06 Mar 15 olle 2357         {
3352 26 May 15 olle 2358           //var deltaCt = ExtractUtils.getNumber(row[deltaCtIndex]);
3176 06 Mar 15 olle 2359           var deltaCtStr = row[deltaCtIndex];
3176 06 Mar 15 olle 2360           // Remove any double quotes surrounding value string
3176 06 Mar 15 olle 2361           if (deltaCtStr.indexOf('"') == 0)
3176 06 Mar 15 olle 2362           {
3176 06 Mar 15 olle 2363             deltaCtStr = deltaCtStr.substring(1, deltaCtStr.length - 1);
3176 06 Mar 15 olle 2364           }
3352 26 May 15 olle 2365           var deltaCt = ExtractUtils.getNumber(deltaCtStr);
3176 06 Mar 15 olle 2366           if (isNaN(deltaCt))
3176 06 Mar 15 olle 2367           {
3176 06 Mar 15 olle 2368             Wizard.setInputStatus('qPcrFile', 'invalid', 'On line ' + (i+1) + '; No valid delta-Ct value for "' + sampleId + '": ' + row[deltaCtIndex]);
3176 06 Mar 15 olle 2369             return;
3176 06 Mar 15 olle 2370           }
3176 06 Mar 15 olle 2371           else
3176 06 Mar 15 olle 2372           {
3176 06 Mar 15 olle 2373             // Store values
3176 06 Mar 15 olle 2374             rnaOrDna.deltaCt = deltaCt;
3176 06 Mar 15 olle 2375             numImported++;
3176 06 Mar 15 olle 2376           }
3176 06 Mar 15 olle 2377         }
3176 06 Mar 15 olle 2378       }
3176 06 Mar 15 olle 2379
3176 06 Mar 15 olle 2380       if (numImported != numQPcrItems)
3176 06 Mar 15 olle 2381       {
3176 06 Mar 15 olle 2382         Wizard.setInputStatus('qPcrFile', 'invalid', 'Could not find values for all ' + numQPcrItems + ' samples: ' + numImported);
3176 06 Mar 15 olle 2383         return;
3176 06 Mar 15 olle 2384       }
3176 06 Mar 15 olle 2385
3271 23 Apr 15 olle 2386       if (qPcrFileInfoText)
3271 23 Apr 15 olle 2387       {
3271 23 Apr 15 olle 2388         Wizard.setInputStatus('qPcrFile', 'flag', qPcrFileInfoText);
3271 23 Apr 15 olle 2389       }
3271 23 Apr 15 olle 2390       else
3271 23 Apr 15 olle 2391       {
3271 23 Apr 15 olle 2392         Wizard.setInputStatus('qPcrFile', 'valid');
3271 23 Apr 15 olle 2393       }
3176 06 Mar 15 olle 2394       qPcrFileIsValid = true;
3176 06 Mar 15 olle 2395     }
3176 06 Mar 15 olle 2396     finally
3176 06 Mar 15 olle 2397     {
3176 06 Mar 15 olle 2398       exreg.updateDetailsTable();
3176 06 Mar 15 olle 2399     }
3176 06 Mar 15 olle 2400   }
3176 06 Mar 15 olle 2401
3176 06 Mar 15 olle 2402   exreg.findQPcrColumn = function(columns, col)
3176 06 Mar 15 olle 2403   {
3176 06 Mar 15 olle 2404     var colIndex = columns.indexOf(col);
3176 06 Mar 15 olle 2405     if (colIndex == -1)
3176 06 Mar 15 olle 2406     {
3176 06 Mar 15 olle 2407       Wizard.setInputStatus('qPcrFile', 'invalid', 'On line 1; Can\'t find "' + col + '" column');
3176 06 Mar 15 olle 2408     }
3176 06 Mar 15 olle 2409     return colIndex;
3176 06 Mar 15 olle 2410   }
3176 06 Mar 15 olle 2411
3227 07 Apr 15 olle 2412   exreg.findRnaOrDna = function(sampleId, lineNo, messageId)
3176 06 Mar 15 olle 2413   {
3176 06 Mar 15 olle 2414     // Get list of selected extract source items
3176 06 Mar 15 olle 2415     var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 2416     var numItems = selItemsList.length;
3176 06 Mar 15 olle 2417     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 2418     {
3176 06 Mar 15 olle 2419       var item = selItemsList[i];
3176 06 Mar 15 olle 2420       var test_rna_name = item.rna.name;
3176 06 Mar 15 olle 2421       var test_dna_name = item.dna.name;
3352 26 May 15 olle 2422       if (ExtractUtils.isRna(item))
3176 06 Mar 15 olle 2423       {
3176 06 Mar 15 olle 2424         test_rna_name = item.name;
3227 07 Apr 15 olle 2425       }
3352 26 May 15 olle 2426       if (ExtractUtils.isDna(item))
3227 07 Apr 15 olle 2427       {
3176 06 Mar 15 olle 2428         test_dna_name = item.name;
3176 06 Mar 15 olle 2429       }
3176 06 Mar 15 olle 2430       if (test_rna_name == sampleId)
3176 06 Mar 15 olle 2431       {
3176 06 Mar 15 olle 2432         return item.rna;
3176 06 Mar 15 olle 2433       }
3176 06 Mar 15 olle 2434       else if (test_dna_name == sampleId)
3176 06 Mar 15 olle 2435       {
3176 06 Mar 15 olle 2436         return item.dna;
3176 06 Mar 15 olle 2437       }
3176 06 Mar 15 olle 2438     }
3271 23 Apr 15 olle 2439     if (messageId)
3271 23 Apr 15 olle 2440     {
3271 23 Apr 15 olle 2441       Wizard.setInputStatus(messageId, 'invalid', 'On line ' + lineNo + '; Can\'t find RNA/DNA with name "' + sampleId + '"');
3271 23 Apr 15 olle 2442     }
3176 06 Mar 15 olle 2443     return null;
3176 06 Mar 15 olle 2444   }
3176 06 Mar 15 olle 2445
3332 12 May 15 olle 2446   exreg.downloadReagentLotNoFile = function()
3332 12 May 15 olle 2447   {
3332 12 May 15 olle 2448     var frm = document.forms['meludi'];
3332 12 May 15 olle 2449     
3332 12 May 15 olle 2450     var reagentInfo = {};
3332 12 May 15 olle 2451     var url = '../Extraction.servlet?ID='+App.getSessionId();
3332 12 May 15 olle 2452     url += '&cmd=DownloadReagentLotNoFile';
3432 29 Jun 15 olle 2453     url += '&startListName='+encodeURIComponent(frm.startListName.value);
3332 12 May 15 olle 2454     url += '&isolationDate='+encodeURIComponent(frm.isolationDate.value);
3332 12 May 15 olle 2455     
3332 12 May 15 olle 2456     // Reagents
3332 12 May 15 olle 2457     for (var i = 0; i < exreg.REAGENTS.length; i++)
3332 12 May 15 olle 2458     {
3332 12 May 15 olle 2459       var rg = exreg.REAGENTS[i];
3332 12 May 15 olle 2460       reagentInfo[rg] = frm[rg].value;
3332 12 May 15 olle 2461     }
3332 12 May 15 olle 2462
3332 12 May 15 olle 2463     url += '&reagentInfo=' + encodeURIComponent(JSON.stringify(reagentInfo));
3332 12 May 15 olle 2464     window.open(url);
3332 12 May 15 olle 2465   }
3332 12 May 15 olle 2466   
3176 06 Mar 15 olle 2467   exreg.generateFakeNanoDropFile = function()
3176 06 Mar 15 olle 2468   {
3176 06 Mar 15 olle 2469     if (location.protocol == 'https:')
3176 06 Mar 15 olle 2470     {
3176 06 Mar 15 olle 2471       Forms.showNotification('btnFakeNanoDropFile', 'For security reasons, this function can\'t be used on HTTPS servers.');
3176 06 Mar 15 olle 2472       return;
3176 06 Mar 15 olle 2473     }
3176 06 Mar 15 olle 2474     
3176 06 Mar 15 olle 2475     var FILE_HEADER = ['Well', 'Sample ID', 'Conc.', '260/280', '260/230'];
3176 06 Mar 15 olle 2476     var data = FILE_HEADER.join('\t')+'\n';
3176 06 Mar 15 olle 2477     
3176 06 Mar 15 olle 2478     // Get list of selected extract source items
3176 06 Mar 15 olle 2479     var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 2480     var numItems = selItemsList.length;
3176 06 Mar 15 olle 2481     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 2482     {
3176 06 Mar 15 olle 2483       var item = selItemsList[i];
3352 26 May 15 olle 2484       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3176 06 Mar 15 olle 2485       {
3176 06 Mar 15 olle 2486         var line = [];
3176 06 Mar 15 olle 2487         // RNA
3176 06 Mar 15 olle 2488         line[0] = item.rna.well;
3352 26 May 15 olle 2489         if (ExtractUtils.isSpecimen(item))
3227 07 Apr 15 olle 2490         {
3227 07 Apr 15 olle 2491           line[1] = item.rna.name;
3227 07 Apr 15 olle 2492         }
3352 26 May 15 olle 2493         else if (ExtractUtils.isRna(item))
3227 07 Apr 15 olle 2494         {
3227 07 Apr 15 olle 2495           line[1] = item.name;
3227 07 Apr 15 olle 2496         }
3176 06 Mar 15 olle 2497         line[2] = Numbers.formatNumber(Math.random()*100+10, 2);
3176 06 Mar 15 olle 2498         line[3] = Numbers.formatNumber(Math.random()*.5+2, 2);
3176 06 Mar 15 olle 2499         line[4] = Numbers.formatNumber(Math.random()+1, 2);
3176 06 Mar 15 olle 2500         data += line.join('\t') + '\n';      
3176 06 Mar 15 olle 2501       }
3176 06 Mar 15 olle 2502     }
3176 06 Mar 15 olle 2503     exreg.parseNanoDropFile(data);
3176 06 Mar 15 olle 2504   }
3176 06 Mar 15 olle 2505
3176 06 Mar 15 olle 2506   exreg.generateFakeDnaInput = function()
3176 06 Mar 15 olle 2507   {
3176 06 Mar 15 olle 2508     if (location.protocol == 'https:')
3176 06 Mar 15 olle 2509     {
3176 06 Mar 15 olle 2510       Forms.showNotification('btnFakeDnaInput', 'For security reasons, this function can\'t be used on HTTPS servers.');
3176 06 Mar 15 olle 2511       return;
3176 06 Mar 15 olle 2512     }
3176 06 Mar 15 olle 2513     
3176 06 Mar 15 olle 2514     var FILE_HEADER = ['Well', 'Sample ID', 'Conc.', '260/280', '260/230'];
3176 06 Mar 15 olle 2515     var data = FILE_HEADER.join('\t')+'\n';
3176 06 Mar 15 olle 2516
3176 06 Mar 15 olle 2517     // Get list of selected extract source items
3176 06 Mar 15 olle 2518     var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 2519     var numItems = selItemsList.length;
3176 06 Mar 15 olle 2520     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 2521     {
3176 06 Mar 15 olle 2522       var item = selItemsList[i];
3352 26 May 15 olle 2523       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isDna(item))
3176 06 Mar 15 olle 2524       {
3176 06 Mar 15 olle 2525         var line = [];
3176 06 Mar 15 olle 2526         // DNA
3176 06 Mar 15 olle 2527         line[0] = item.dna.well;
3352 26 May 15 olle 2528         if (ExtractUtils.isSpecimen(item))
3227 07 Apr 15 olle 2529         {
3227 07 Apr 15 olle 2530           line[1] = item.dna.name;
3227 07 Apr 15 olle 2531         }
3352 26 May 15 olle 2532         else if (ExtractUtils.isDna(item))
3227 07 Apr 15 olle 2533         {
3227 07 Apr 15 olle 2534           line[1] = item.name;
3227 07 Apr 15 olle 2535         }
3176 06 Mar 15 olle 2536         line[2] = Numbers.formatNumber(Math.random()*100+10, 2);
3176 06 Mar 15 olle 2537         line[3] = Numbers.formatNumber(Math.random()*.5+2, 2);
3176 06 Mar 15 olle 2538         line[4] = Numbers.formatNumber(Math.random()+1, 2);
3176 06 Mar 15 olle 2539         data += line.join('\t') + '\n';      
3176 06 Mar 15 olle 2540       }
3176 06 Mar 15 olle 2541     }
3176 06 Mar 15 olle 2542     exreg.parseDnaInput(data);
3176 06 Mar 15 olle 2543   }
3176 06 Mar 15 olle 2544
3176 06 Mar 15 olle 2545   exreg.generateFakeQPcrFile = function()
3176 06 Mar 15 olle 2546   {
3176 06 Mar 15 olle 2547     if (location.protocol == 'https:')
3176 06 Mar 15 olle 2548     {
3176 06 Mar 15 olle 2549       Forms.showNotification('btnFakeQPcrFile', 'For security reasons, this function can\'t be used on HTTPS servers.');
3176 06 Mar 15 olle 2550       return;
3176 06 Mar 15 olle 2551     }
3176 06 Mar 15 olle 2552     var FILE_HEADER = ['Well', 'Fluor', 'Content', 'Sample', 'Cq', 'Ct', 'Delta Ct'];
3176 06 Mar 15 olle 2553     var data = FILE_HEADER.join(',')+'\n';
3176 06 Mar 15 olle 2554     
3176 06 Mar 15 olle 2555     // Get list of selected extract source items
3176 06 Mar 15 olle 2556     var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 2557     var numItems = selItemsList.length;
3176 06 Mar 15 olle 2558     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 2559     {
3176 06 Mar 15 olle 2560       var item = selItemsList[i];
3352 26 May 15 olle 2561       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isDna(item))
3176 06 Mar 15 olle 2562       {
3176 06 Mar 15 olle 2563         for (var j = 0; j < 3; j++)
3176 06 Mar 15 olle 2564         {
3176 06 Mar 15 olle 2565           var line = [];
3176 06 Mar 15 olle 2566           // DNA
3176 06 Mar 15 olle 2567           line[0] = item.dna.well;
3176 06 Mar 15 olle 2568           line[1] = 'SYBR';
3176 06 Mar 15 olle 2569           line[2] = 'Unkn';
3352 26 May 15 olle 2570           if (ExtractUtils.isSpecimen(item))
3227 07 Apr 15 olle 2571           {
3227 07 Apr 15 olle 2572             line[3] = item.dna.name;
3227 07 Apr 15 olle 2573           }
3352 26 May 15 olle 2574           else if (ExtractUtils.isDna(item))
3227 07 Apr 15 olle 2575           {
3227 07 Apr 15 olle 2576             line[3] = item.name;
3227 07 Apr 15 olle 2577           }
3176 06 Mar 15 olle 2578           if (j == 0)
3176 06 Mar 15 olle 2579           {
3176 06 Mar 15 olle 2580             line[4] = '"' + Numbers.formatNumber(Math.random()*100+10, 2) + '"';
3176 06 Mar 15 olle 2581             line[5] = '"' + Numbers.formatNumber(Math.random()*.5+2, 2) + '"';
3176 06 Mar 15 olle 2582             line[6] = '"' + Numbers.formatNumber(Math.random()+1, 2) + '"';
3176 06 Mar 15 olle 2583           }
3176 06 Mar 15 olle 2584           else
3176 06 Mar 15 olle 2585           {
3176 06 Mar 15 olle 2586             line[4] = '"' + Numbers.formatNumber(Math.random()*100+10, 2) + '"';
3176 06 Mar 15 olle 2587             line[5] = '';
3176 06 Mar 15 olle 2588             line[6] = '';
3176 06 Mar 15 olle 2589           }
3176 06 Mar 15 olle 2590           data += line.join(',') + '\n';
3176 06 Mar 15 olle 2591         }  
3176 06 Mar 15 olle 2592       }
3176 06 Mar 15 olle 2593     }
3176 06 Mar 15 olle 2594     exreg.parseQPcrFile(data);
3176 06 Mar 15 olle 2595   }
3176 06 Mar 15 olle 2596
3176 06 Mar 15 olle 2597   exreg.validateStep3 = function(event)
3176 06 Mar 15 olle 2598   {
3176 06 Mar 15 olle 2599     var valid = true;
3224 02 Apr 15 olle 2600 /*
3176 06 Mar 15 olle 2601     valid &= nanoDropFileIsValid;
3224 02 Apr 15 olle 2602 */
3176 06 Mar 15 olle 2603     valid &= qiacubePositionsAreValid;
3176 06 Mar 15 olle 2604     
3176 06 Mar 15 olle 2605     if (!valid) event.preventDefault();
3176 06 Mar 15 olle 2606   }
3176 06 Mar 15 olle 2607
3176 06 Mar 15 olle 2608   exreg.submit = function()
3176 06 Mar 15 olle 2609   {
3176 06 Mar 15 olle 2610     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 2611     
3176 06 Mar 15 olle 2612     var submitInfo = {};
3176 06 Mar 15 olle 2613     submitInfo.items = [];
3176 06 Mar 15 olle 2614
3176 06 Mar 15 olle 2615     // Get list of selected extract source items
3176 06 Mar 15 olle 2616     var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 2617     var numItems = selItemsList.length;
3176 06 Mar 15 olle 2618     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 2619     {
3176 06 Mar 15 olle 2620       var item = selItemsList[i];
3177 09 Mar 15 olle 2621 /*
3352 26 May 15 olle 2622       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3176 06 Mar 15 olle 2623       {
3176 06 Mar 15 olle 2624         item.rna.preNormalize = frm['rnaPreNormalize'+i].checked;
3176 06 Mar 15 olle 2625       }
3176 06 Mar 15 olle 2626       else
3176 06 Mar 15 olle 2627       {
3176 06 Mar 15 olle 2628         item.rna.preNormalize = false;
3176 06 Mar 15 olle 2629       }
3177 09 Mar 15 olle 2630 */
3176 06 Mar 15 olle 2631       submitInfo.items[submitInfo.items.length] = item;
3176 06 Mar 15 olle 2632     }
3176 06 Mar 15 olle 2633     
3176 06 Mar 15 olle 2634     // Extraction
3432 29 Jun 15 olle 2635     submitInfo.startListName = frm.startListName.value;
3432 29 Jun 15 olle 2636     submitInfo.startListId = frm.startListId.value;
3180 17 Mar 15 olle 2637     submitInfo.isolationDate = frm.isolationDate.value;
3501 21 Sep 15 olle 2638     submitInfo.extractionOperator = frm.extractionOperator.value;
3180 17 Mar 15 olle 2639     submitInfo.extractionProtocol = parseInt(frm.extractionProtocolId.value, 10);
3352 26 May 15 olle 2640     submitInfo.rnaDefaultVolume = ExtractUtils.getNumber(frm.rnaDefaultVolume.value);
3352 26 May 15 olle 2641     submitInfo.dnaDefaultVolume = ExtractUtils.getNumber(frm.dnaDefaultVolume.value);
3176 06 Mar 15 olle 2642     
3176 06 Mar 15 olle 2643     // QIAcube
3176 06 Mar 15 olle 2644     submitInfo.qiacubeDate = frm.qiacubeDate.value;
3501 21 Sep 15 olle 2645     submitInfo.qiacubeOperator = frm.qiacubeOperator.value;
3176 06 Mar 15 olle 2646     submitInfo.qiacubeRunNo = parseInt(frm.qiacubeRunNo.value, 10);
3176 06 Mar 15 olle 2647
3176 06 Mar 15 olle 2648     // Reagents
3176 06 Mar 15 olle 2649     for (var i = 0; i < exreg.REAGENTS.length; i++)
3176 06 Mar 15 olle 2650     {
3176 06 Mar 15 olle 2651       var rg = exreg.REAGENTS[i];
3176 06 Mar 15 olle 2652       submitInfo[rg] = frm[rg].value;
3176 06 Mar 15 olle 2653     }
3176 06 Mar 15 olle 2654
3176 06 Mar 15 olle 2655     var url = '../Extraction.servlet?ID='+App.getSessionId();
3176 06 Mar 15 olle 2656     url += '&cmd=RegisterDnaRna';
3176 06 Mar 15 olle 2657     Wizard.showLoadingAnimation('Performing registration...');
3176 06 Mar 15 olle 2658     Wizard.asyncJsonRequest(url, exreg.submissionResults, 'POST', JSON.stringify(submitInfo));
3176 06 Mar 15 olle 2659   }
3176 06 Mar 15 olle 2660   
3176 06 Mar 15 olle 2661   exreg.submissionResults = function(response)
3176 06 Mar 15 olle 2662   {
3176 06 Mar 15 olle 2663     Wizard.showFinalMessage(response.messages);
3176 06 Mar 15 olle 2664     Doc.show('gorestart');
3199 19 Mar 15 olle 2665     Doc.show('gocreate');
3336 13 May 15 olle 2666     trackingProtocolPreview = false;
3176 06 Mar 15 olle 2667     if (response.createdRna && response.createdRna.length > 0)
3176 06 Mar 15 olle 2668     {
3176 06 Mar 15 olle 2669       createdRna = response.createdRna;
3176 06 Mar 15 olle 2670 /*
3176 06 Mar 15 olle 2671       Doc.show('rnaQcWizard');
3176 06 Mar 15 olle 2672 */
3176 06 Mar 15 olle 2673     }
3176 06 Mar 15 olle 2674   }
3176 06 Mar 15 olle 2675
3176 06 Mar 15 olle 2676   exreg.createProtocol = function()
3176 06 Mar 15 olle 2677   {
3176 06 Mar 15 olle 2678     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 2679     var submitInfo = {};
3176 06 Mar 15 olle 2680     submitInfo.items = [];
3176 06 Mar 15 olle 2681
3180 17 Mar 15 olle 2682     submitInfo.docMode = 'report';
3176 06 Mar 15 olle 2683     // Get list of selected extract source items
3176 06 Mar 15 olle 2684     var selItemsList = exreg.getSelectedItemsList();
3176 06 Mar 15 olle 2685     var numItems = selItemsList.length;
3432 29 Jun 15 olle 2686     var totNumItems = numItems;
3180 17 Mar 15 olle 2687     for (var i = 0; i < totNumItems; i++)
3176 06 Mar 15 olle 2688     {
3180 17 Mar 15 olle 2689       var item = null;
3432 29 Jun 15 olle 2690       item = selItemsList[i];
3177 09 Mar 15 olle 2691 /*
3352 26 May 15 olle 2692       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3176 06 Mar 15 olle 2693       {
3176 06 Mar 15 olle 2694         item.rna.preNormalize = frm['rnaPreNormalize'+i].checked;
3176 06 Mar 15 olle 2695       }
3176 06 Mar 15 olle 2696       else
3176 06 Mar 15 olle 2697       {
3176 06 Mar 15 olle 2698         item.rna.preNormalize = false;
3176 06 Mar 15 olle 2699       }
3177 09 Mar 15 olle 2700 */
3176 06 Mar 15 olle 2701       submitInfo.items[submitInfo.items.length] = item;
3176 06 Mar 15 olle 2702     }
3176 06 Mar 15 olle 2703
3176 06 Mar 15 olle 2704     // Extraction
3432 29 Jun 15 olle 2705     submitInfo.startListName = frm.startListName.value;
3180 17 Mar 15 olle 2706     submitInfo.isolationDate = frm.isolationDate.value;
3501 21 Sep 15 olle 2707     submitInfo.extractionOperator = frm.extractionOperator.value;
3180 17 Mar 15 olle 2708     submitInfo.extractionProtocol = parseInt(frm.extractionProtocolId.value, 10);
3180 17 Mar 15 olle 2709     var extractionProtocolName = frm.extractionProtocolName.value;
3176 06 Mar 15 olle 2710     var protocolVersionNo = '';
3176 06 Mar 15 olle 2711     if (extractionProtocolName)
3176 06 Mar 15 olle 2712     {
3202 19 Mar 15 olle 2713       protocolVersionNo = extractionProtocolName;
3202 19 Mar 15 olle 2714       // Remove part of string up to and including last "v"
3202 19 Mar 15 olle 2715       var vIndex = protocolVersionNo.indexOf('v');
3202 19 Mar 15 olle 2716       while (vIndex >= 0)
3176 06 Mar 15 olle 2717       {
3202 19 Mar 15 olle 2718         // Remove part of string up to and including first "v"
3202 19 Mar 15 olle 2719         protocolVersionNo = protocolVersionNo.substring(vIndex + 1);
3202 19 Mar 15 olle 2720         vIndex = protocolVersionNo.indexOf('v');
3176 06 Mar 15 olle 2721       }
3176 06 Mar 15 olle 2722     }
3199 19 Mar 15 olle 2723     var protocolPreviewFlag = null;
3336 13 May 15 olle 2724     if (trackingProtocolPreview)
3199 19 Mar 15 olle 2725     {
3199 19 Mar 15 olle 2726       protocolPreviewFlag = 'true';
3199 19 Mar 15 olle 2727     }
3176 06 Mar 15 olle 2728     submitInfo.extractionProtocolName = extractionProtocolName;
3176 06 Mar 15 olle 2729     submitInfo.protocolVersionNo = protocolVersionNo;
3199 19 Mar 15 olle 2730     submitInfo.protocolPreviewFlag = protocolPreviewFlag;
3352 26 May 15 olle 2731     submitInfo.dnaDefaultVolume = ExtractUtils.getNumber(frm.dnaDefaultVolume.value);
3176 06 Mar 15 olle 2732     
3176 06 Mar 15 olle 2733     // QIAcube
3176 06 Mar 15 olle 2734     submitInfo.qiacubeDate = frm.qiacubeDate.value;
3501 21 Sep 15 olle 2735     submitInfo.qiacubeOperator = frm.qiacubeOperator.value;
3176 06 Mar 15 olle 2736     submitInfo.qiacubeRunNo = parseInt(frm.qiacubeRunNo.value, 10);
3501 21 Sep 15 olle 2737
3501 21 Sep 15 olle 2738     // Specimen reagents
3501 21 Sep 15 olle 2739     submitInfo.xyleneSpecimen = frm.xyleneSpecimen.value;
3501 21 Sep 15 olle 2740     submitInfo.etoh995Specimen = frm.etoh995Specimen.value;
3176 06 Mar 15 olle 2741     submitInfo.allPrepFfpeKit = frm.allPrepFfpeKit.value;
3501 21 Sep 15 olle 2742     submitInfo.bufferPkdSpecimen = frm.bufferPkdSpecimen.value;
3501 21 Sep 15 olle 2743     submitInfo.bufferAtlSpecimen = frm.bufferAtlSpecimen.value;
3501 21 Sep 15 olle 2744     submitInfo.proteinaseKSpecimen = frm.proteinaseKSpecimen.value;
3501 21 Sep 15 olle 2745     submitInfo.rnaseASpecimen = frm.rnaseASpecimen.value;
3501 21 Sep 15 olle 2746
3501 21 Sep 15 olle 2747     // QIAcube
3501 21 Sep 15 olle 2748     submitInfo.etoh995 = frm.etoh995.value;
3501 21 Sep 15 olle 2749     submitInfo.bufferRlt = frm.bufferRlt.value;
3501 21 Sep 15 olle 2750     submitInfo.bufferFrn = frm.bufferFrn.value;
3501 21 Sep 15 olle 2751     submitInfo.bufferRpe = frm.bufferRpe.value;
3501 21 Sep 15 olle 2752     submitInfo.bufferAl = frm.bufferAl.value;
3501 21 Sep 15 olle 2753     submitInfo.bufferAw1 = frm.bufferAw1.value;
3501 21 Sep 15 olle 2754     submitInfo.bufferAw2 = frm.bufferAw2.value;
3501 21 Sep 15 olle 2755     submitInfo.bufferAte = frm.bufferAte.value;
3501 21 Sep 15 olle 2756     submitInfo.bufferRdd = frm.bufferRdd.value;
3501 21 Sep 15 olle 2757     submitInfo.rnaseFreeWater = frm.rnaseFreeWater.value;
3436 02 Jul 15 olle 2758     submitInfo.dnaseMix = frm.dnaseMix.value;
3501 21 Sep 15 olle 2759     submitInfo.rneasyMinEluteSpinColumn = frm.rneasyMinEluteSpinColumn.value;
3501 21 Sep 15 olle 2760     submitInfo.qiaampMinEluteSpinColumn = frm.qiaampMinEluteSpinColumn.value;
3176 06 Mar 15 olle 2761
3324 11 May 15 olle 2762     // Quality control reagents
3324 11 May 15 olle 2763     submitInfo.kapaSybrFast = frm.kapaSybrFast.value;
3324 11 May 15 olle 2764     submitInfo.qualityControlPrimersQcpRgt = frm.qualityControlPrimersQcpRgt.value;
3438 03 Jul 15 olle 2765     submitInfo.qualityControlTemplateQct = frm.qualityControlTemplateQct.value;
3324 11 May 15 olle 2766     submitInfo.qubitDnaHighSens = frm.qubitDnaHighSens.value;
3324 11 May 15 olle 2767     submitInfo.qubitDnaBroadRange = frm.qubitDnaBroadRange.value;
3324 11 May 15 olle 2768
3176 06 Mar 15 olle 2769     // Save values in hidden input fields for retrieval after HTML request
3176 06 Mar 15 olle 2770     var submitInfoJsonStr = JSON.stringify(submitInfo);
3176 06 Mar 15 olle 2771     frm.hiddenSubmitInfo.value = submitInfoJsonStr;
3176 06 Mar 15 olle 2772     frm.hiddenNumItems.value = submitInfo.items.length;
3176 06 Mar 15 olle 2773     frm.hiddenCounterBalanceInfoRow.value = counterBalanceInfoRow;
3176 06 Mar 15 olle 2774
3176 06 Mar 15 olle 2775     // Calling frm.submit() will change jsp file to extraction_protocol2.jsp
3176 06 Mar 15 olle 2776     frm.submit();
3176 06 Mar 15 olle 2777   }
3176 06 Mar 15 olle 2778
3176 06 Mar 15 olle 2779 /*
3176 06 Mar 15 olle 2780   exreg.goRnaQc = function()
3176 06 Mar 15 olle 2781   {
3176 06 Mar 15 olle 2782     var url = 'rnaqc_aliquot.jsp?ID='+App.getSessionId();
3176 06 Mar 15 olle 2783     for (var i = 0; i < createdRna.length; i++)
3176 06 Mar 15 olle 2784     {
3176 06 Mar 15 olle 2785       url += '&rna='+createdRna[i];
3176 06 Mar 15 olle 2786     }
3176 06 Mar 15 olle 2787     location.href = url;
3176 06 Mar 15 olle 2788   }
3176 06 Mar 15 olle 2789 */
3176 06 Mar 15 olle 2790   
3176 06 Mar 15 olle 2791   return exreg;
3176 06 Mar 15 olle 2792 }();
3176 06 Mar 15 olle 2793
3176 06 Mar 15 olle 2794 Doc.onLoad(ExtractionReg.initPage);
3176 06 Mar 15 olle 2795