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

Code
Comments
Other
Rev Date Author Line
3225 02 Apr 15 olle 1 var ExtractionFormCopy = function()
3225 02 Apr 15 olle 2 {
3225 02 Apr 15 olle 3   var exreg = {};
3225 02 Apr 15 olle 4   var debug = 0;
3225 02 Apr 15 olle 5   
3225 02 Apr 15 olle 6   exreg.REAGENTS = [
3225 02 Apr 15 olle 7     'xyleneSpecimen', 'etoh995Specimen', 'bufferPkdSpecimen', 'bufferAtlSpecimen',
3225 02 Apr 15 olle 8     'proteinaseKSpecimen', 'rnaseASpecimen', 'allPrepFfpeKit', 'etoh995',
3225 02 Apr 15 olle 9     'bufferRlt', 'bufferFrn', 'bufferRpe', 'bufferAl',
3225 02 Apr 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'
3225 02 Apr 15 olle 13     ];
3225 02 Apr 15 olle 14
3225 02 Apr 15 olle 15
3225 02 Apr 15 olle 16   var DEFAULT_EXTRACTION_PROTOCOL_NAME_START = 'Extraction_using_Allprep_DNA_RNA_FFPE_kit_with_overnight_proteinaseK_incubation.v';
3225 02 Apr 15 olle 17   var DEFAULT_RNA_VOLUME = 25;
3234 09 Apr 15 olle 18   var DEFAULT_DNA_VOLUME = 25;
3225 02 Apr 15 olle 19   var MINIMAL_PRE_NORMALIZE_QUANTITY = 1.1; // µg
3225 02 Apr 15 olle 20   var protocolMap = {};
3225 02 Apr 15 olle 21
3225 02 Apr 15 olle 22   var extraItemsList = [];
3354 27 May 15 olle 23   var qiacubeSortedPrefixes = 'BCADEFGHIJKLMNOPQRSTUVWXYZ';
3225 02 Apr 15 olle 24   var qiacubeDateIsAfterIsolationDate = true;
3225 02 Apr 15 olle 25   var qiacubeRunNoIsValid = false;
3225 02 Apr 15 olle 26   var qiacubePositionsAreValid = false;
3225 02 Apr 15 olle 27   var counterBalanceInfoRow = false;
3225 02 Apr 15 olle 28   var createdRna = [];
3225 02 Apr 15 olle 29   
3225 02 Apr 15 olle 30   // Page initialization
3225 02 Apr 15 olle 31   exreg.initPage = function()
3225 02 Apr 15 olle 32   {
3225 02 Apr 15 olle 33     // Step 1
3225 02 Apr 15 olle 34     Events.addEventHandler('step-1', 'wizard-validate', exreg.validateStep1);
3225 02 Apr 15 olle 35
3225 02 Apr 15 olle 36     // Step 2
3225 02 Apr 15 olle 37     Events.addEventHandler('step-2', 'wizard-initialize', exreg.initializeStep2);
3225 02 Apr 15 olle 38     Events.addEventHandler('step-2', 'wizard-validate', exreg.validateStep2);
3225 02 Apr 15 olle 39     
3225 02 Apr 15 olle 40     Events.addEventHandler('isolationDate', 'change', Wizard.validateDate);
3225 02 Apr 15 olle 41     Events.addEventHandler('qiacubeDate', 'change', Wizard.validateDate);
3225 02 Apr 15 olle 42     Events.addEventHandler('isolationDate', 'change', exreg.qiacubeDateOnChange);
3225 02 Apr 15 olle 43     Events.addEventHandler('qiacubeDate', 'change', exreg.qiacubeDateOnChange);
3225 02 Apr 15 olle 44     Events.addEventHandler('qiacubeRunNo', 'change', exreg.qiacubeRunNoOnChange);
3225 02 Apr 15 olle 45     
3332 12 May 15 olle 46     Buttons.addClickHandler('downloadReagentLotNoFile', exreg.downloadReagentLotNoFile);
3332 12 May 15 olle 47
3225 02 Apr 15 olle 48     // Step 3
3225 02 Apr 15 olle 49     Events.addEventHandler('step-3', 'wizard-initialize', exreg.initializeStep3);
3225 02 Apr 15 olle 50     Events.addEventHandler('step-3', 'wizard-validate', exreg.validateStep3);
3225 02 Apr 15 olle 51
3231 08 Apr 15 olle 52     Buttons.addClickHandler('downloadSampleIdFile', exreg.downloadSampleIdFile);
3231 08 Apr 15 olle 53     Buttons.addClickHandler('downloadQPcrSampleIdFile', exreg.downloadQPcrSampleIdFile);
3231 08 Apr 15 olle 54     
3225 02 Apr 15 olle 55     // Navigation
3225 02 Apr 15 olle 56     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
3225 02 Apr 15 olle 57     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
3225 02 Apr 15 olle 58     Buttons.addClickHandler('gocreate', exreg.createProtocol);
3225 02 Apr 15 olle 59     
3225 02 Apr 15 olle 60     var url = '../Extraction.servlet?ID='+App.getSessionId();
3432 29 Jun 15 olle 61     url += '&cmd=GetStartItemLists';
3254 17 Apr 15 olle 62     url += '&orderDesc=true';    
3225 02 Apr 15 olle 63     Wizard.showLoadingAnimation('Loading unprocessed items...');
3225 02 Apr 15 olle 64     Wizard.asyncJsonRequest(url, exreg.initializeStep1);
3225 02 Apr 15 olle 65   }
3225 02 Apr 15 olle 66   
3225 02 Apr 15 olle 67   exreg.initializeStep1 = function(response)
3225 02 Apr 15 olle 68   {
3225 02 Apr 15 olle 69     var frm = document.forms['meludi'];
3432 29 Jun 15 olle 70     var itemLists = response.itemLists;
3225 02 Apr 15 olle 71     
3432 29 Jun 15 olle 72     var startList = frm.startList;
3432 29 Jun 15 olle 73     if (itemLists.length > 0)
3225 02 Apr 15 olle 74     {
3432 29 Jun 15 olle 75       for (var i=0; i < itemLists.length; i++)
3225 02 Apr 15 olle 76       {
3432 29 Jun 15 olle 77         var itemList = itemLists[i];
3432 29 Jun 15 olle 78         var name = (i+1) + ': ' + Strings.encodeTags(itemList.name);
3432 29 Jun 15 olle 79         if (itemList.sourceItemNames)
3225 02 Apr 15 olle 80         {
3225 02 Apr 15 olle 81           name += ' -- (';
3432 29 Jun 15 olle 82           name += itemList.numMeludiItems;
3432 29 Jun 15 olle 83           name += ' + ' + itemList.numExtraItems;
3225 02 Apr 15 olle 84           name += ')';
3225 02 Apr 15 olle 85         }
3432 29 Jun 15 olle 86         if (itemList.extractionDate)
3254 17 Apr 15 olle 87         {
3432 29 Jun 15 olle 88           name += ' -- [' + exreg.asDate(itemList.extractionDate) + ']';
3254 17 Apr 15 olle 89         }
3432 29 Jun 15 olle 90         var selected = i == (itemLists.length - 1);
3432 29 Jun 15 olle 91         var option = new Option(name, itemList.id, selected, selected);
3432 29 Jun 15 olle 92         option.itemList = itemList;
3432 29 Jun 15 olle 93         startList.options[startList.length] = option;
3225 02 Apr 15 olle 94       }
3432 29 Jun 15 olle 95       startList.options[0].selected = true;
3225 02 Apr 15 olle 96     }
3225 02 Apr 15 olle 97     else
3225 02 Apr 15 olle 98     {
3432 29 Jun 15 olle 99       Wizard.setFatalError('No start lists available.');
3225 02 Apr 15 olle 100       return;
3225 02 Apr 15 olle 101     }
3225 02 Apr 15 olle 102     Doc.show('step-1');
3225 02 Apr 15 olle 103     Doc.show('gonext');
3225 02 Apr 15 olle 104     Doc.hide('extractSourceItems');
3225 02 Apr 15 olle 105   }
3225 02 Apr 15 olle 106
3225 02 Apr 15 olle 107   exreg.validateStep1 = function(event)
3225 02 Apr 15 olle 108   {
3225 02 Apr 15 olle 109     var frm = document.forms['meludi'];
3432 29 Jun 15 olle 110     var startList = null;
3432 29 Jun 15 olle 111     for (var i = 0; i < frm.startList.length; i++)
3225 02 Apr 15 olle 112     {
3432 29 Jun 15 olle 113       if (frm.startList[i].selected)
3225 02 Apr 15 olle 114       {
3432 29 Jun 15 olle 115         startList = frm.startList[i];
3225 02 Apr 15 olle 116       }
3225 02 Apr 15 olle 117     }
3432 29 Jun 15 olle 118     if (startList == null)
3225 02 Apr 15 olle 119     {
3225 02 Apr 15 olle 120       event.preventDefault();
3225 02 Apr 15 olle 121     }
3225 02 Apr 15 olle 122   }
3225 02 Apr 15 olle 123   
3225 02 Apr 15 olle 124   exreg.initializeStep2 = function()
3225 02 Apr 15 olle 125   {
3225 02 Apr 15 olle 126     var frm = document.forms['meludi'];
3432 29 Jun 15 olle 127     var startItemList = null;
3432 29 Jun 15 olle 128     for (var i = 0; i < frm.startList.length; i++)
3225 02 Apr 15 olle 129     {
3432 29 Jun 15 olle 130       if (frm.startList[i].selected)
3225 02 Apr 15 olle 131       {
3432 29 Jun 15 olle 132         startItemList = frm.startList[i];
3225 02 Apr 15 olle 133       }
3225 02 Apr 15 olle 134     }
3432 29 Jun 15 olle 135     if (startItemList == null)
3225 02 Apr 15 olle 136     {
3432 29 Jun 15 olle 137       //alert("exreg.validateStep1(): startItemList == null");
3225 02 Apr 15 olle 138       event.preventDefault();
3225 02 Apr 15 olle 139     }
3225 02 Apr 15 olle 140
3432 29 Jun 15 olle 141     frm.startList.disabled = true;
3225 02 Apr 15 olle 142 /*
3225 02 Apr 15 olle 143     frm.rnaDefaultVolume.value = DEFAULT_RNA_VOLUME;
3225 02 Apr 15 olle 144     frm.dnaDefaultVolume.value = DEFAULT_DNA_VOLUME;
3225 02 Apr 15 olle 145 */
3225 02 Apr 15 olle 146
3225 02 Apr 15 olle 147     Wizard.setCurrentStep(2);
3225 02 Apr 15 olle 148     Doc.show('gocancel');
3225 02 Apr 15 olle 149     Doc.show('gonext');
3225 02 Apr 15 olle 150     Doc.hide('extractionProtocolId');
3501 21 Sep 15 olle 151 /*    
3225 02 Apr 15 olle 152     Doc.hide('rnaDefaultVolumeSection');
3225 02 Apr 15 olle 153     Doc.hide('dnaDefaultVolumeSection');
3225 02 Apr 15 olle 154     Doc.hide('xyleneSpecimenSection');
3225 02 Apr 15 olle 155     Doc.hide('etoh995SpecimenSection');
3225 02 Apr 15 olle 156     Doc.hide('bufferPkdSpecimenSection');
3225 02 Apr 15 olle 157     Doc.hide('bufferAtlSpecimenSection');
3225 02 Apr 15 olle 158     Doc.hide('proteinaseKSpecimenSection');
3225 02 Apr 15 olle 159     Doc.hide('rnaseASpecimenSection');
3225 02 Apr 15 olle 160
3225 02 Apr 15 olle 161     Doc.hide('etoh995Section');
3225 02 Apr 15 olle 162     Doc.hide('bufferRltSection');
3225 02 Apr 15 olle 163     Doc.hide('bufferFrnSection');
3225 02 Apr 15 olle 164     Doc.hide('bufferRpeSection');
3225 02 Apr 15 olle 165     Doc.hide('bufferAlSection');
3225 02 Apr 15 olle 166     Doc.hide('bufferAw1Section');
3225 02 Apr 15 olle 167     Doc.hide('bufferAw2Section');
3225 02 Apr 15 olle 168     Doc.hide('bufferAteSection');
3225 02 Apr 15 olle 169     Doc.hide('bufferRddSection');
3225 02 Apr 15 olle 170     Doc.hide('rnaseFreeWaterSection');
3225 02 Apr 15 olle 171     Doc.hide('dnaseMixSection');
3225 02 Apr 15 olle 172     Doc.hide('rneasyMinEluteSpinColumnSection');
3225 02 Apr 15 olle 173     Doc.hide('qiaampMinEluteSpinColumnSection');
3225 02 Apr 15 olle 174
3324 11 May 15 olle 175     Doc.hide('kapaSybrFastSection');
3324 11 May 15 olle 176     Doc.hide('qualityControlPrimersQcpRgtSection');
3438 03 Jul 15 olle 177     Doc.hide('qualityControlTemplateQctSection');
3324 11 May 15 olle 178     Doc.hide('qubitDnaHighSensSection');
3324 11 May 15 olle 179     Doc.hide('qubitDnaBroadRangeSection');
3501 21 Sep 15 olle 180 */
3324 11 May 15 olle 181
3225 02 Apr 15 olle 182     frm.isolationDate.focus();
3225 02 Apr 15 olle 183     Events.sendChangeEvent('isolationDate');
3225 02 Apr 15 olle 184     Events.sendChangeEvent('qiacubeDate');
3225 02 Apr 15 olle 185
3225 02 Apr 15 olle 186     var url = '../Extraction.servlet?ID='+App.getSessionId();
3432 29 Jun 15 olle 187     url += '&cmd=GetSourceItemListFromStartItemList';
3432 29 Jun 15 olle 188     url += '&startItemListId='+startItemList.value;
3225 02 Apr 15 olle 189     Wizard.asyncJsonRequest(url, exreg.sourceItemListLoaded);
3225 02 Apr 15 olle 190   }
3225 02 Apr 15 olle 191
3225 02 Apr 15 olle 192   exreg.sourceItemListLoaded = function(response)
3225 02 Apr 15 olle 193   {
3225 02 Apr 15 olle 194     var frm = document.forms['meludi'];
3225 02 Apr 15 olle 195
3432 29 Jun 15 olle 196     var startItemList = response.startitemlist;
3225 02 Apr 15 olle 197     var specimens = response.specimens;
3225 02 Apr 15 olle 198     var rnas = response.rnas;
3225 02 Apr 15 olle 199     var dnas = response.dnas;
3225 02 Apr 15 olle 200     var items = response.items;
3432 29 Jun 15 olle 201     var startListIsProcessed = false;
3245 14 Apr 15 olle 202     extraItemsList = response.extraitems;
3225 02 Apr 15 olle 203     //alert("exreg.sourceItemListLoaded(): specimens.length = " + specimens.length + " rnas.length = " + rnas.length + " dnas.length = " + dnas.length);
3225 02 Apr 15 olle 204
3432 29 Jun 15 olle 205     if (startItemList)
3225 02 Apr 15 olle 206     {
3225 02 Apr 15 olle 207       // Extraction parameters
3432 29 Jun 15 olle 208       frm.startListName.value = startItemList.name;
3501 21 Sep 15 olle 209
3225 02 Apr 15 olle 210       // Extraction parameters
3432 29 Jun 15 olle 211       frm.isolationDate.value = startItemList.isolationDate;
3501 21 Sep 15 olle 212       frm.extractionOperator.value = startItemList.extractionOperator;
3432 29 Jun 15 olle 213       frm.extractionProtocolId.value = startItemList.extractionProtocolId;
3432 29 Jun 15 olle 214       frm.extractionProtocolName.value = startItemList.extractionProtocolName;
3432 29 Jun 15 olle 215       if (startItemList.extractionDate)
3225 02 Apr 15 olle 216       {
3432 29 Jun 15 olle 217         startListIsProcessed = true;
3225 02 Apr 15 olle 218       }
3432 29 Jun 15 olle 219       //alert("exreg.sourceItemListLoaded(): startItemList.name = " + startItemList.name + " startItemList.extractionDate = " + startItemList.extractionDate);
3432 29 Jun 15 olle 220       if (startListIsProcessed)
3225 02 Apr 15 olle 221       {
3432 29 Jun 15 olle 222         frm.rnaDefaultVolume.value = startItemList.rnaDefaultVolume;
3432 29 Jun 15 olle 223         frm.dnaDefaultVolume.value = startItemList.dnaDefaultVolume;
3225 02 Apr 15 olle 224       }
3225 02 Apr 15 olle 225       // QIAcube parameters
3432 29 Jun 15 olle 226       frm.qiacubeDate.value = startItemList.qiacubeDate;
3501 21 Sep 15 olle 227       frm.qiacubeOperator.value = startItemList.qiacubeOperator;
3432 29 Jun 15 olle 228       frm.qiacubePrimaryPrefix.value = startItemList.qiacubePrimaryPrefix;
3432 29 Jun 15 olle 229       frm.qiacubeSecondaryPrefix.value = startItemList.qiacubeSecondaryPrefix;
3432 29 Jun 15 olle 230       frm.qiacubeRunNo.value = startItemList.qiacubeRunNo;
3501 21 Sep 15 olle 231
3501 21 Sep 15 olle 232       // Specimen reagents
3501 21 Sep 15 olle 233       frm.xyleneSpecimen.value = startItemList.xyleneSpecimen;
3501 21 Sep 15 olle 234       frm.etoh995Specimen.value = startItemList.etoh995Specimen;
3432 29 Jun 15 olle 235       frm.allPrepFfpeKit.value = startItemList.allPrepFfpeKit;
3501 21 Sep 15 olle 236       frm.bufferPkdSpecimen.value = startItemList.bufferPkdSpecimen;
3501 21 Sep 15 olle 237       frm.bufferAtlSpecimen.value = startItemList.bufferAtlSpecimen;
3501 21 Sep 15 olle 238       frm.proteinaseKSpecimen.value = startItemList.proteinaseKSpecimen;
3501 21 Sep 15 olle 239       frm.rnaseASpecimen.value = startItemList.rnaseASpecimen;
3225 02 Apr 15 olle 240
3501 21 Sep 15 olle 241       // QIAcube reagents
3501 21 Sep 15 olle 242       frm.etoh995.value = startItemList.etoh995;
3501 21 Sep 15 olle 243       frm.bufferRlt.value = startItemList.bufferRlt;
3501 21 Sep 15 olle 244       frm.bufferFrn.value = startItemList.bufferFrn;
3501 21 Sep 15 olle 245       frm.bufferRpe.value = startItemList.bufferRpe;
3501 21 Sep 15 olle 246       frm.bufferAl.value = startItemList.bufferAl;
3501 21 Sep 15 olle 247       frm.bufferAw1.value = startItemList.bufferAw1;
3501 21 Sep 15 olle 248       frm.bufferAw2.value = startItemList.bufferAw2;
3501 21 Sep 15 olle 249       frm.bufferAte.value = startItemList.bufferAte;
3501 21 Sep 15 olle 250       frm.bufferRdd.value = startItemList.bufferRdd;
3501 21 Sep 15 olle 251       frm.rnaseFreeWater.value = startItemList.rnaseFreeWater;
3501 21 Sep 15 olle 252       frm.dnaseMix.value = startItemList.dnaseMix;
3501 21 Sep 15 olle 253       frm.rneasyMinEluteSpinColumn.value = startItemList.rneasyMinEluteSpinColumn;
3501 21 Sep 15 olle 254       frm.qiaampMinEluteSpinColumn.value = startItemList.qiaampMinEluteSpinColumn;
3501 21 Sep 15 olle 255
3501 21 Sep 15 olle 256       // Quality control reagents
3501 21 Sep 15 olle 257       frm.kapaSybrFast.value = startItemList.kapaSybrFast;
3501 21 Sep 15 olle 258       frm.qualityControlPrimersQcpRgt.value = startItemList.qualityControlPrimersQcpRgt;
3501 21 Sep 15 olle 259       frm.qualityControlTemplateQct.value = startItemList.qualityControlTemplateQct;
3501 21 Sep 15 olle 260       frm.qubitDnaHighSens.value = startItemList.qubitDnaHighSens;
3501 21 Sep 15 olle 261       frm.qubitDnaBroadRange.value = startItemList.qubitDnaBroadRange;
3501 21 Sep 15 olle 262
3225 02 Apr 15 olle 263       // Disable input fields
3225 02 Apr 15 olle 264
3225 02 Apr 15 olle 265       // Extraction parameters
3432 29 Jun 15 olle 266       frm.startListName.disabled = true;
3225 02 Apr 15 olle 267       frm.isolationDate.disabled = true;
3501 21 Sep 15 olle 268       frm.extractionOperator.disabled = true;
3225 02 Apr 15 olle 269       frm.extractionProtocolName.disabled = true;
3225 02 Apr 15 olle 270       frm.rnaDefaultVolume.disabled = true;
3225 02 Apr 15 olle 271       frm.dnaDefaultVolume.disabled = true;
3225 02 Apr 15 olle 272
3225 02 Apr 15 olle 273       // Specimen reagents
3225 02 Apr 15 olle 274       frm.xyleneSpecimen.disabled = true;
3225 02 Apr 15 olle 275       frm.etoh995Specimen.disabled = true;
3501 21 Sep 15 olle 276       frm.allPrepFfpeKit.disabled = true;
3225 02 Apr 15 olle 277       frm.bufferPkdSpecimen.disabled = true;
3225 02 Apr 15 olle 278       frm.bufferAtlSpecimen.disabled = true;
3225 02 Apr 15 olle 279       frm.proteinaseKSpecimen.disabled = true;
3225 02 Apr 15 olle 280       frm.rnaseASpecimen.disabled = true;
3225 02 Apr 15 olle 281
3225 02 Apr 15 olle 282       // QIAcube parameters
3225 02 Apr 15 olle 283       frm.qiacubeDate.disabled = true;
3501 21 Sep 15 olle 284       frm.qiacubeOperator.disabled = true;
3225 02 Apr 15 olle 285       frm.qiacubePrimaryPrefix.disabled = true;
3225 02 Apr 15 olle 286       frm.qiacubeSecondaryPrefix.disabled = true;
3225 02 Apr 15 olle 287       frm.qiacubeRunNo.disabled = true;
3225 02 Apr 15 olle 288
3225 02 Apr 15 olle 289       // QIAcube reagents
3225 02 Apr 15 olle 290       frm.etoh995.disabled = true;
3225 02 Apr 15 olle 291       frm.bufferRlt.disabled = true;
3225 02 Apr 15 olle 292       frm.bufferFrn.disabled = true;
3225 02 Apr 15 olle 293       frm.bufferRpe.disabled = true;
3225 02 Apr 15 olle 294       frm.bufferAl.disabled = true;
3225 02 Apr 15 olle 295       frm.bufferAw1.disabled = true;
3225 02 Apr 15 olle 296       frm.bufferAw2.disabled = true;
3225 02 Apr 15 olle 297       frm.bufferAte.disabled = true;
3225 02 Apr 15 olle 298       frm.bufferRdd.disabled = true;
3225 02 Apr 15 olle 299       frm.rnaseFreeWater.disabled = true;
3225 02 Apr 15 olle 300       frm.dnaseMix.disabled = true;
3225 02 Apr 15 olle 301       frm.rneasyMinEluteSpinColumn.disabled = true;
3225 02 Apr 15 olle 302       frm.qiaampMinEluteSpinColumn.disabled = true;
3324 11 May 15 olle 303
3324 11 May 15 olle 304       // Quality control reagents
3324 11 May 15 olle 305       frm.kapaSybrFast.disabled = true;
3324 11 May 15 olle 306       frm.qualityControlPrimersQcpRgt.disabled = true;
3438 03 Jul 15 olle 307       frm.qualityControlTemplateQct.disabled = true;
3324 11 May 15 olle 308       frm.qubitDnaHighSens.disabled = true;
3324 11 May 15 olle 309       frm.qubitDnaBroadRange.disabled = true;
3225 02 Apr 15 olle 310     }
3225 02 Apr 15 olle 311
3225 02 Apr 15 olle 312     var sourceItemList = frm.extractSourceItems;
3225 02 Apr 15 olle 313     if (items.length > 0)
3225 02 Apr 15 olle 314     {
3225 02 Apr 15 olle 315       var numItems = items.length;
3225 02 Apr 15 olle 316       for (var i=0; i < items.length; i++)
3225 02 Apr 15 olle 317       {
3225 02 Apr 15 olle 318         var item = items[i];
3225 02 Apr 15 olle 319         var name = (i+1) + ': ' + Strings.encodeTags(item.name);
3225 02 Apr 15 olle 320         if (item.bioWell)
3225 02 Apr 15 olle 321         {
3225 02 Apr 15 olle 322           name += ' -- ' + Strings.encodeTags(item.bioWell.bioPlate.name + ' (' + item.bioWell.location+')');
3225 02 Apr 15 olle 323         }
3225 02 Apr 15 olle 324         var selected = true;
3225 02 Apr 15 olle 325         // Identification of item via id works here as specimens and extracts
3225 02 Apr 15 olle 326         // are stored in the same database table using discriminators, and are
3225 02 Apr 15 olle 327         // therefore guaranteed to not have the same id value as another item in the table.
3225 02 Apr 15 olle 328         var option = new Option(name, item.id, selected, selected);
3225 02 Apr 15 olle 329         option.item = item;
3225 02 Apr 15 olle 330         sourceItemList.options[sourceItemList.length] = option;
3225 02 Apr 15 olle 331       }
3225 02 Apr 15 olle 332     }
3225 02 Apr 15 olle 333     else
3225 02 Apr 15 olle 334     {
3225 02 Apr 15 olle 335       Wizard.setFatalError('No items available for processing.');
3225 02 Apr 15 olle 336       return;
3225 02 Apr 15 olle 337     }
3225 02 Apr 15 olle 338
3432 29 Jun 15 olle 339     // Load reagents lot no.s from first created DNA for start list
3432 29 Jun 15 olle 340     if (startListIsProcessed)
3225 02 Apr 15 olle 341     {
3225 02 Apr 15 olle 342       // Set form copy default to "report"
3225 02 Apr 15 olle 343       var formCopyTypeMenu = frm.formCopyType;
3225 02 Apr 15 olle 344       var selected = true;
3336 13 May 15 olle 345       var option = new Option('Tracking protocol', 'protocol', selected, selected);
3225 02 Apr 15 olle 346       formCopyTypeMenu.options[0] = option;
3225 02 Apr 15 olle 347       option = new Option('Tracking report', 'report', selected, selected);
3225 02 Apr 15 olle 348       option.disabled = false;
3225 02 Apr 15 olle 349       formCopyTypeMenu.options[1] = option;
3225 02 Apr 15 olle 350       frm.formCopyType.value = 'report';
3501 21 Sep 15 olle 351
3501 21 Sep 15 olle 352 /*      
3225 02 Apr 15 olle 353       // Find first specimen
3225 02 Apr 15 olle 354       var specimen = null;
3225 02 Apr 15 olle 355       for (var i=0; i < items.length; i++)
3225 02 Apr 15 olle 356       {
3225 02 Apr 15 olle 357         var item = items[i];
3352 26 May 15 olle 358         if (ExtractUtils.isSpecimen(item))
3225 02 Apr 15 olle 359         {
3225 02 Apr 15 olle 360           specimen = item;
3225 02 Apr 15 olle 361           break;
3225 02 Apr 15 olle 362         }
3225 02 Apr 15 olle 363       }
3225 02 Apr 15 olle 364       
3432 29 Jun 15 olle 365       //alert("exreg.sourceItemListLoaded(): startItemList.name = " + startItemList.name + " specimen.name = " + specimen.name);
3225 02 Apr 15 olle 366       if (specimen)
3225 02 Apr 15 olle 367       {
3225 02 Apr 15 olle 368         var dnaName = specimen.name + '.d';
3225 02 Apr 15 olle 369
3225 02 Apr 15 olle 370         var url = '../Extraction.servlet?ID='+App.getSessionId();
3225 02 Apr 15 olle 371         url += '&cmd=GetDna&name='+dnaName;
3225 02 Apr 15 olle 372         Wizard.asyncJsonRequest(url, exreg.reagentLotNosFromDna);
3225 02 Apr 15 olle 373       }
3501 21 Sep 15 olle 374 */
3225 02 Apr 15 olle 375     }
3225 02 Apr 15 olle 376     else
3225 02 Apr 15 olle 377     {
3336 13 May 15 olle 378       // Set form copy default to "protocol" and disable option "report"
3225 02 Apr 15 olle 379       var formCopyTypeMenu = frm.formCopyType;
3225 02 Apr 15 olle 380       var selected = true;
3336 13 May 15 olle 381       var option = new Option('Tracking protocol', 'protocol', selected, selected);
3225 02 Apr 15 olle 382       formCopyTypeMenu.options[0] = option;
3225 02 Apr 15 olle 383       option = new Option('Tracking report (not available)', 'report', false, false);
3225 02 Apr 15 olle 384       option.disabled = true;
3225 02 Apr 15 olle 385       formCopyTypeMenu.options[1] = option;
3225 02 Apr 15 olle 386     }
3225 02 Apr 15 olle 387   }
3225 02 Apr 15 olle 388
3225 02 Apr 15 olle 389   exreg.reagentLotNosFromDna = function(response)
3225 02 Apr 15 olle 390   {
3225 02 Apr 15 olle 391     var frm = document.forms['meludi'];
3225 02 Apr 15 olle 392     var dna = response.dna;
3225 02 Apr 15 olle 393
3225 02 Apr 15 olle 394     if (dna)
3225 02 Apr 15 olle 395     {
3225 02 Apr 15 olle 396       // Reset the existing values
3225 02 Apr 15 olle 397
3501 21 Sep 15 olle 398       // FFPE DNA/RNA Kit
3225 02 Apr 15 olle 399       var allPrepFfpeKit = '';
3225 02 Apr 15 olle 400
3225 02 Apr 15 olle 401       // Specimen reagents
3225 02 Apr 15 olle 402       var specXylene = '';
3225 02 Apr 15 olle 403       var specEtoh995 = '';
3225 02 Apr 15 olle 404       var specBufferPkd = '';
3225 02 Apr 15 olle 405       var specBufferAtl = '';
3225 02 Apr 15 olle 406       var specProteinaseK = '';
3225 02 Apr 15 olle 407       var specRNAseA = '';
3225 02 Apr 15 olle 408
3225 02 Apr 15 olle 409       // QIAcube reagents
3225 02 Apr 15 olle 410       var bufferRlt = '';
3225 02 Apr 15 olle 411       var etoh995 = '';
3225 02 Apr 15 olle 412       var bufferFrn = '';
3225 02 Apr 15 olle 413       var bufferRpe = '';
3225 02 Apr 15 olle 414       var rnaseFreeWater = '';
3225 02 Apr 15 olle 415       var dnaseMix = '';
3225 02 Apr 15 olle 416       var bufferRdd = '';
3225 02 Apr 15 olle 417       var rneasyMinEluteSpinColumn = '';
3225 02 Apr 15 olle 418       var bufferAl = '';
3225 02 Apr 15 olle 419       var bufferAW1 = '';
3225 02 Apr 15 olle 420       var bufferAW2 = '';
3225 02 Apr 15 olle 421       var bufferAte = '';
3225 02 Apr 15 olle 422       var qiaampMinEluteSpinColumn = '';
3225 02 Apr 15 olle 423
3324 11 May 15 olle 424       // Quality control reagents
3324 11 May 15 olle 425       var kapaSybrFast = '';
3324 11 May 15 olle 426       var qualityControlPrimersQcpRgt = '';
3438 03 Jul 15 olle 427       var qualityControlTemplateQct = '';
3324 11 May 15 olle 428       var qubitDnaHighSens = '';
3324 11 May 15 olle 429       var qubitDnaBroadRange = '';
3324 11 May 15 olle 430
3501 21 Sep 15 olle 431       // FFPE DNA/RNA Kit
3225 02 Apr 15 olle 432       allPrepFfpeKit = dna.allPrepFfpeKit;
3225 02 Apr 15 olle 433
3225 02 Apr 15 olle 434       // Specimen reagents
3225 02 Apr 15 olle 435       specXylene = dna.xyleneSpecimen;
3225 02 Apr 15 olle 436       specEtoh995 = dna.etoh995Specimen;
3225 02 Apr 15 olle 437       specBufferPkd = dna.bufferPkdSpecimen;
3225 02 Apr 15 olle 438       specBufferAtl = dna.bufferAtlSpecimen;
3225 02 Apr 15 olle 439       specProteinaseK = dna.proteinaseKSpecimen;
3225 02 Apr 15 olle 440       specRNAseA = dna.rnaseASpecimen;
3225 02 Apr 15 olle 441
3225 02 Apr 15 olle 442       // QIAcube reagents
3225 02 Apr 15 olle 443       bufferRlt = dna.bufferRlt;
3225 02 Apr 15 olle 444       etoh995 = dna.etoh995;
3225 02 Apr 15 olle 445       bufferFrn = dna.bufferFrn;
3225 02 Apr 15 olle 446       bufferRpe = dna.bufferRpe;
3225 02 Apr 15 olle 447       rnaseFreeWater = dna.rnaseFreeWater;
3225 02 Apr 15 olle 448       dnaseMix = dna.dnaseMix;
3225 02 Apr 15 olle 449       bufferRdd = dna.bufferRdd;
3225 02 Apr 15 olle 450       rneasyMinEluteSpinColumn = dna.rneasyMinEluteSpinColumn;
3225 02 Apr 15 olle 451       bufferAl = dna.bufferAl;
3225 02 Apr 15 olle 452       bufferAW1 = dna.bufferAw1;
3225 02 Apr 15 olle 453       bufferAW2 = dna.bufferAw2;
3225 02 Apr 15 olle 454       bufferAte = dna.bufferAte;
3331 12 May 15 olle 455       qiaampMinEluteSpinColumn = dna.qiaampMinEluteSpinColumn;
3225 02 Apr 15 olle 456
3324 11 May 15 olle 457       // Quality control reagents
3324 11 May 15 olle 458       kapaSybrFast = dna.kapaSybrFast;
3324 11 May 15 olle 459       qualityControlPrimersQcpRgt = dna.qualityControlPrimersQcpRgt;
3438 03 Jul 15 olle 460       qualityControlTemplateQct = dna.qualityControlTemplateQct;
3324 11 May 15 olle 461       qubitDnaHighSens = dna.qubitDnaHighSens;
3324 11 May 15 olle 462       qubitDnaBroadRange = dna.qubitDnaBroadRange;
3324 11 May 15 olle 463
3225 02 Apr 15 olle 464       // Update reagent values
3225 02 Apr 15 olle 465
3501 21 Sep 15 olle 466       // FFPE DNA/RNA Kit
3225 02 Apr 15 olle 467       if (frm.allPrepFfpeKit.value == null || frm.allPrepFfpeKit.value == '')
3225 02 Apr 15 olle 468       {
3225 02 Apr 15 olle 469         frm.allPrepFfpeKit.value = allPrepFfpeKit;
3225 02 Apr 15 olle 470       }
3225 02 Apr 15 olle 471
3225 02 Apr 15 olle 472       // Specimen reagents
3225 02 Apr 15 olle 473       frm.xyleneSpecimen.value = specXylene;
3225 02 Apr 15 olle 474       frm.etoh995Specimen.value = specEtoh995;
3225 02 Apr 15 olle 475       frm.bufferPkdSpecimen.value = specBufferPkd;
3225 02 Apr 15 olle 476       frm.bufferAtlSpecimen.value = specBufferAtl;
3225 02 Apr 15 olle 477       frm.proteinaseKSpecimen.value = specProteinaseK;
3225 02 Apr 15 olle 478       frm.rnaseASpecimen.value = specRNAseA;
3225 02 Apr 15 olle 479
3225 02 Apr 15 olle 480       // QIAcube reagents
3225 02 Apr 15 olle 481       frm.etoh995.value = etoh995;
3225 02 Apr 15 olle 482       frm.bufferRlt.value = bufferRlt;
3225 02 Apr 15 olle 483       frm.bufferFrn.value = bufferFrn;
3225 02 Apr 15 olle 484       frm.bufferRpe.value = bufferRpe;
3225 02 Apr 15 olle 485       frm.bufferAl.value = bufferAl;
3225 02 Apr 15 olle 486       frm.bufferAw1.value = bufferAW1;
3225 02 Apr 15 olle 487       frm.bufferAw2.value = bufferAW2;
3225 02 Apr 15 olle 488       frm.bufferAte.value = bufferAte;
3225 02 Apr 15 olle 489       frm.bufferRdd.value = bufferRdd;
3225 02 Apr 15 olle 490       frm.rnaseFreeWater.value = rnaseFreeWater;
3225 02 Apr 15 olle 491       frm.dnaseMix.value = dnaseMix;
3225 02 Apr 15 olle 492       frm.rneasyMinEluteSpinColumn.value = rneasyMinEluteSpinColumn;
3225 02 Apr 15 olle 493       frm.qiaampMinEluteSpinColumn.value = qiaampMinEluteSpinColumn;
3225 02 Apr 15 olle 494
3324 11 May 15 olle 495       // Quality control reagents
3324 11 May 15 olle 496       frm.kapaSybrFast.value = kapaSybrFast;
3324 11 May 15 olle 497       frm.qualityControlPrimersQcpRgt.value = qualityControlPrimersQcpRgt;
3438 03 Jul 15 olle 498       frm.qualityControlTemplateQct.value = qualityControlTemplateQct;
3324 11 May 15 olle 499       frm.qubitDnaHighSens.value = qubitDnaHighSens;
3324 11 May 15 olle 500       frm.qubitDnaBroadRange.value = qubitDnaBroadRange;
3324 11 May 15 olle 501
3225 02 Apr 15 olle 502       Doc.show('rnaDefaultVolumeSection');
3225 02 Apr 15 olle 503       Doc.show('dnaDefaultVolumeSection');
3225 02 Apr 15 olle 504       Doc.show('xyleneSpecimenSection');
3225 02 Apr 15 olle 505       Doc.show('etoh995SpecimenSection');
3225 02 Apr 15 olle 506       Doc.show('bufferPkdSpecimenSection');
3225 02 Apr 15 olle 507       Doc.show('bufferAtlSpecimenSection');
3225 02 Apr 15 olle 508       Doc.show('proteinaseKSpecimenSection');
3225 02 Apr 15 olle 509       Doc.show('rnaseASpecimenSection');
3225 02 Apr 15 olle 510
3225 02 Apr 15 olle 511       Doc.show('etoh995Section');
3225 02 Apr 15 olle 512       Doc.show('bufferRltSection');
3225 02 Apr 15 olle 513       Doc.show('bufferFrnSection');
3225 02 Apr 15 olle 514       Doc.show('bufferRpeSection');
3225 02 Apr 15 olle 515       Doc.show('bufferAlSection');
3225 02 Apr 15 olle 516       Doc.show('bufferAw1Section');
3225 02 Apr 15 olle 517       Doc.show('bufferAw2Section');
3225 02 Apr 15 olle 518       Doc.show('bufferAteSection');
3225 02 Apr 15 olle 519       Doc.show('bufferRddSection');
3225 02 Apr 15 olle 520       Doc.show('rnaseFreeWaterSection');
3225 02 Apr 15 olle 521       Doc.show('dnaseMixSection');
3225 02 Apr 15 olle 522       Doc.show('rneasyMinEluteSpinColumnSection');
3225 02 Apr 15 olle 523       Doc.show('qiaampMinEluteSpinColumnSection');
3324 11 May 15 olle 524
3324 11 May 15 olle 525       Doc.show('kapaSybrFastSection');
3324 11 May 15 olle 526       Doc.show('qualityControlPrimersQcpRgtSection');
3438 03 Jul 15 olle 527       Doc.show('qualityControlTemplateQctSection');
3324 11 May 15 olle 528       Doc.show('qubitDnaHighSensSection');
3324 11 May 15 olle 529       Doc.show('qubitDnaBroadRangeSection');
3225 02 Apr 15 olle 530     }
3225 02 Apr 15 olle 531   }
3225 02 Apr 15 olle 532
3225 02 Apr 15 olle 533   exreg.qiacubeDateOnChange = function()
3225 02 Apr 15 olle 534   {
3225 02 Apr 15 olle 535     var frm = document.forms['meludi'];
3225 02 Apr 15 olle 536     
3225 02 Apr 15 olle 537     var isolationDateIsValid = Wizard.isValid('isolationDate');
3225 02 Apr 15 olle 538     var qiacubeDateIsValid = Wizard.isValid('qiacubeDate');
3225 02 Apr 15 olle 539     
3225 02 Apr 15 olle 540     if (!isolationDateIsValid || !qiacubeDateIsValid) return;
3225 02 Apr 15 olle 541
3225 02 Apr 15 olle 542     var isolationDate = Dates.parseString(frm.isolationDate.value, 'yyyyMMdd');
3225 02 Apr 15 olle 543     var qiacubeDate = Dates.parseString(frm.qiacubeDate.value, 'yyyyMMdd');
3225 02 Apr 15 olle 544     if (isolationDate > qiacubeDate)
3225 02 Apr 15 olle 545     {
3225 02 Apr 15 olle 546       Wizard.setInputStatus('qiacubeDate', 'invalid', 'QIAcube date is before isolation date');
3225 02 Apr 15 olle 547       qiacubeDateIsAfterIsolationDate = false;
3225 02 Apr 15 olle 548       return;
3225 02 Apr 15 olle 549     }
3225 02 Apr 15 olle 550
3225 02 Apr 15 olle 551     qiacubeDateIsAfterIsolationDate = true;
3225 02 Apr 15 olle 552     
3225 02 Apr 15 olle 553     Wizard.setInputStatus('qiacubeDate', 'valid');
3225 02 Apr 15 olle 554     var url = '../Extraction.servlet?ID='+App.getSessionId();
3225 02 Apr 15 olle 555     url += '&cmd=GetNextQiacubeRunNo&qiacubeDate='+encodeURIComponent(frm.qiacubeDate.value);
3225 02 Apr 15 olle 556     Wizard.showLoadingAnimation('Loading Qiacube run number...');
3225 02 Apr 15 olle 557     Wizard.asyncJsonRequest(url, exreg.gotNextRunNumber);
3225 02 Apr 15 olle 558   }
3225 02 Apr 15 olle 559
3225 02 Apr 15 olle 560   exreg.gotNextRunNumber = function(response)
3225 02 Apr 15 olle 561   {
3225 02 Apr 15 olle 562     var frm = document.forms['meludi'];
3225 02 Apr 15 olle 563     frm.qiacubeRunNo.value = response.nextQiacubeRunNo;
3225 02 Apr 15 olle 564     Events.sendChangeEvent('qiacubeRunNo');
3225 02 Apr 15 olle 565   }
3225 02 Apr 15 olle 566
3225 02 Apr 15 olle 567   exreg.qiacubeRunNoOnChange = function()
3225 02 Apr 15 olle 568   {
3225 02 Apr 15 olle 569     var frm = document.forms['meludi'];
3225 02 Apr 15 olle 570     var runNumber = frm.qiacubeRunNo.value;
3225 02 Apr 15 olle 571     qiacubeRunNoIsValid = false;
3225 02 Apr 15 olle 572
3225 02 Apr 15 olle 573     if (runNumber == '')
3225 02 Apr 15 olle 574     {
3225 02 Apr 15 olle 575       Wizard.setInputStatus('qiacubeRunNo', 'invalid', 'Missing');
3225 02 Apr 15 olle 576       return;
3225 02 Apr 15 olle 577     }
3225 02 Apr 15 olle 578     if (!(parseInt(runNumber, 10) >= 1))
3225 02 Apr 15 olle 579     {
3225 02 Apr 15 olle 580       Wizard.setInputStatus('qiacubeRunNo', 'invalid', 'Must be at least 1');
3225 02 Apr 15 olle 581       return;    
3225 02 Apr 15 olle 582     }
3225 02 Apr 15 olle 583     
3225 02 Apr 15 olle 584     Wizard.setInputStatus('qiacubeRunNo', 'valid');
3225 02 Apr 15 olle 585     qiacubeRunNoIsValid = true;
3225 02 Apr 15 olle 586   }
3225 02 Apr 15 olle 587
3225 02 Apr 15 olle 588   exreg.validateStep2 = function(event)
3225 02 Apr 15 olle 589   {
3225 02 Apr 15 olle 590     var valid = true;
3225 02 Apr 15 olle 591     valid &= Wizard.isValid('isolationDate');
3225 02 Apr 15 olle 592     valid &= Wizard.isValid('qiacubeDate');
3225 02 Apr 15 olle 593     valid &= qiacubeRunNoIsValid;
3225 02 Apr 15 olle 594     
3225 02 Apr 15 olle 595     if (!valid) event.preventDefault();
3225 02 Apr 15 olle 596   }
3225 02 Apr 15 olle 597
3225 02 Apr 15 olle 598   exreg.initializeStep3 = function()
3225 02 Apr 15 olle 599   {
3225 02 Apr 15 olle 600     var frm = document.forms['meludi'];
3432 29 Jun 15 olle 601     var startItemList = null;
3432 29 Jun 15 olle 602     for (var i = 0; i < frm.startList.length; i++)
3432 29 Jun 15 olle 603     {
3432 29 Jun 15 olle 604       if (frm.startList[i].selected)
3432 29 Jun 15 olle 605       {
3432 29 Jun 15 olle 606         startItemList = frm.startList[i];
3432 29 Jun 15 olle 607       }
3432 29 Jun 15 olle 608     }
3432 29 Jun 15 olle 609     if (startItemList == null)
3432 29 Jun 15 olle 610     {
3432 29 Jun 15 olle 611       //alert("exreg.initializeStep3(): startItemList == null");
3432 29 Jun 15 olle 612       event.preventDefault();
3432 29 Jun 15 olle 613     }
3225 02 Apr 15 olle 614     var docType = frm.formCopyType.value;
3432 29 Jun 15 olle 615     var startListName = frm.startListName.value;
3432 29 Jun 15 olle 616     Doc.element('detailsStartListName').innerHTML = '<b>Start list: ' + startListName + '</b>';
3352 26 May 15 olle 617     var rnaDefaultVolume = ExtractUtils.getNumber(frm.rnaDefaultVolume.value);
3352 26 May 15 olle 618     var dnaDefaultVolume = ExtractUtils.getNumber(frm.dnaDefaultVolume.value);
3225 02 Apr 15 olle 619     qiacubeSortedPrefixes = exreg.getQiacubeSortedPrefixes();
3225 02 Apr 15 olle 620     
3225 02 Apr 15 olle 621     var html = '<table id="detailsTable" class="step-form">';
3225 02 Apr 15 olle 622     // First header row
3225 02 Apr 15 olle 623     html += '<thead>';
3225 02 Apr 15 olle 624     html += '<tr>';
3225 02 Apr 15 olle 625     html += '<th>Extract</th>';
3225 02 Apr 15 olle 626     html += '<th class="dottedleft">QIAcube</th>';
3225 02 Apr 15 olle 627     html += '<th colspan="1" class="dottedleft"></th>';
3225 02 Apr 15 olle 628 /*
3225 02 Apr 15 olle 629     html += '<th colspan="1" class="dottedleft"></th>';
3225 02 Apr 15 olle 630 */
3225 02 Apr 15 olle 631 /*
3225 02 Apr 15 olle 632     html += '<th colspan="5" class="dottedleft">RNA</th>';
3225 02 Apr 15 olle 633 */
3225 02 Apr 15 olle 634     if (docType == 'report')
3225 02 Apr 15 olle 635     {
3276 29 Apr 15 olle 636       html += '<th colspan="5" class="dottedleft">RNA</th>';
3276 29 Apr 15 olle 637       html += '<th colspan="5" class="dottedleft">DNA</th>';
3225 02 Apr 15 olle 638     }
3225 02 Apr 15 olle 639     else
3225 02 Apr 15 olle 640     {
3238 10 Apr 15 olle 641       html += '<th colspan="1" class="dottedleft">NanoDrop</th>';
3276 29 Apr 15 olle 642       html += '<th colspan="1" class="dottedleft">RNA</th>';
3276 29 Apr 15 olle 643       html += '<th colspan="1" class="dottedleft">DNA</th>';
3225 02 Apr 15 olle 644     }
3225 02 Apr 15 olle 645     html += '<th class="dottedleft comment">Comment</th>';
3225 02 Apr 15 olle 646     html += '<th></th>';
3225 02 Apr 15 olle 647     html += '</tr>';
3225 02 Apr 15 olle 648     // Second header row
3225 02 Apr 15 olle 649     html += '<tr>';
3225 02 Apr 15 olle 650     html += '<th>source item</th>';
3225 02 Apr 15 olle 651     html += '<th class="dottedleft">position</th>';
3225 02 Apr 15 olle 652     html += '<td class="dottedleft">Storage</td>';
3225 02 Apr 15 olle 653 /*
3225 02 Apr 15 olle 654     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>';
3225 02 Apr 15 olle 655 */
3225 02 Apr 15 olle 656     if (docType == 'report')
3225 02 Apr 15 olle 657     {
3276 29 Apr 15 olle 658       html += '<td class="dottedleft">NanoDrop</td><td>RNA</td><td>Vol.</td><td>Conc.</td><td>Quantity</td>';
3276 29 Apr 15 olle 659       html += '<td class="dottedleft">DNA</td><td>Vol.</td><td>Conc.</td><td>Quantity</td><td>ΔCt</td>';
3225 02 Apr 15 olle 660     }
3225 02 Apr 15 olle 661     else
3225 02 Apr 15 olle 662     {
5852 06 Mar 20 olle 663       html += '<th class="dottedleft">Box Pos.</th>';
5852 06 Mar 20 olle 664       html += '<th class="dottedleft">Box Pos.</th>';
5852 06 Mar 20 olle 665       html += '<th class="dottedleft">Box Pos.</th>';
3225 02 Apr 15 olle 666     }
3225 02 Apr 15 olle 667     html += '<td class="dottedleft comment"></td>';
3225 02 Apr 15 olle 668     html += '<td></td>';
3225 02 Apr 15 olle 669     html += '</tr>';
3225 02 Apr 15 olle 670     // Third header row
3225 02 Apr 15 olle 671     html += '<tr>';
3225 02 Apr 15 olle 672     html += '<th></th>';
3225 02 Apr 15 olle 673     html += '<th class="dottedleft"></th>';
3225 02 Apr 15 olle 674     html += '<td class="dottedleft">box</td>';
3225 02 Apr 15 olle 675 /*
3225 02 Apr 15 olle 676     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>';
3225 02 Apr 15 olle 677 */
3225 02 Apr 15 olle 678     if (docType == 'report')
3225 02 Apr 15 olle 679     {
5852 06 Mar 20 olle 680       html += '<td class="dottedleft">Pos</td><td>Box Pos.</td><td>(µl)</td><td>(ng/µl)</td><td>(µg)</td>';
5852 06 Mar 20 olle 681       html += '<td class="dottedleft">Box Pos.</td><td>(µl)</td><td>(ng/µl)</td><td>(µg)</td><td></td>';
3225 02 Apr 15 olle 682     }
3225 02 Apr 15 olle 683     else
3225 02 Apr 15 olle 684     {
3225 02 Apr 15 olle 685       html += '<td class="dottedleft"></td>';
3276 29 Apr 15 olle 686       html += '<td class="dottedleft"></td>';
3276 29 Apr 15 olle 687       html += '<td class="dottedleft"></td>';
3225 02 Apr 15 olle 688     }
3225 02 Apr 15 olle 689     html += '<td class="dottedleft comment"></td>';
3225 02 Apr 15 olle 690     html += '<td></td>';
3225 02 Apr 15 olle 691     html += '</tr>';
3225 02 Apr 15 olle 692     html += '</thead>';
3225 02 Apr 15 olle 693     html += '<tbody>';
3225 02 Apr 15 olle 694
3225 02 Apr 15 olle 695     // Get list of selected extract source items
3225 02 Apr 15 olle 696     var selItemsList = exreg.getSelectedItemsList();
3225 02 Apr 15 olle 697     var numItems = selItemsList.length;
3225 02 Apr 15 olle 698     var numSpecimenItems = exreg.getNumberOfSpecimenItems();
3225 02 Apr 15 olle 699     var numRnaItems = exreg.getNumberOfRnaItems();
3225 02 Apr 15 olle 700     var numDnaItems = exreg.getNumberOfDnaItems();
3225 02 Apr 15 olle 701     var numNanoDropItems = numSpecimenItems + numRnaItems;
3432 29 Jun 15 olle 702     var numQiacubeItems = numSpecimenItems;
3432 29 Jun 15 olle 703     var totNumItems = numItems;
3225 02 Apr 15 olle 704     var itemNo = 0;
3225 02 Apr 15 olle 705     var qiacubeItemNo = 0;
3225 02 Apr 15 olle 706     // Set default values for DNA/RNA extraction
3225 02 Apr 15 olle 707     for (var i = 0; i < totNumItems; i++)
3225 02 Apr 15 olle 708     {
3225 02 Apr 15 olle 709       itemNo++;
3225 02 Apr 15 olle 710       var item = null;
3225 02 Apr 15 olle 711       var storageBox = '-';
3276 29 Apr 15 olle 712       var rnaStorageBox = '-';
3276 29 Apr 15 olle 713       var dnaStorageBox = '-';
3432 29 Jun 15 olle 714       item = selItemsList[i];
3432 29 Jun 15 olle 715       var qiacubePos = null;
3432 29 Jun 15 olle 716       if (ExtractUtils.isSpecimen(item))
3225 02 Apr 15 olle 717       {
3432 29 Jun 15 olle 718 /*
3432 29 Jun 15 olle 719         alert("exreg.initializeStep3(): item.name = " + item.name + " JSON.stringify(item) = " + JSON.stringify(item));
3432 29 Jun 15 olle 720         if (item.r)
3225 02 Apr 15 olle 721         {
3432 29 Jun 15 olle 722           alert("exreg.initializeStep3(): item.name = " + item.name + " item.r.name = " + item.r.name + " item.r.ndConc = " + item.r.ndConc);
3432 29 Jun 15 olle 723         }
3432 29 Jun 15 olle 724         if (item.d)
3432 29 Jun 15 olle 725         {
3432 29 Jun 15 olle 726           alert("exreg.initializeStep3(): item.name = " + item.name + " item.d.name = " + item.d.name + " item.d.qubitConc = " + item.d.qubitConc + " item.d.deltaCt = " + item.d.deltaCt);
3432 29 Jun 15 olle 727         }
3225 02 Apr 15 olle 728 */
3432 29 Jun 15 olle 729         qiacubeItemNo++;
3432 29 Jun 15 olle 730         qiacubePos = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems, qiacubeItemNo, qiacubeSortedPrefixes);
3432 29 Jun 15 olle 731       }
3225 02 Apr 15 olle 732 /*
3432 29 Jun 15 olle 733       item.originalQuantity = DEFAULT_SPECIMEN_VOLUME;
3432 29 Jun 15 olle 734       item.processedQuantity = DEFAULT_SPECIMEN_USED;
3225 02 Apr 15 olle 735 */
3432 29 Jun 15 olle 736       item.qiacubePosition = qiacubePos;
3432 29 Jun 15 olle 737       item.originalQiacubePosition = qiacubePos;
3432 29 Jun 15 olle 738       //alert("exreg.initializeStep3(): i = " + i + " item.name = " + item.name + " item.qiacubePosition = " + item.qiacubePosition);
3225 02 Apr 15 olle 739         
3432 29 Jun 15 olle 740       var rna = {};
3432 29 Jun 15 olle 741       var dna = {};
3432 29 Jun 15 olle 742       // RNA
3432 29 Jun 15 olle 743       rna.name = item.name + '.r';
3432 29 Jun 15 olle 744       rna.volume = rnaDefaultVolume;
3432 29 Jun 15 olle 745       // DNA
3432 29 Jun 15 olle 746       dna.name = item.name + '.d';
3432 29 Jun 15 olle 747       dna.volume = dnaDefaultVolume;
3276 29 Apr 15 olle 748 /*
3432 29 Jun 15 olle 749       item.rna = rna;
3432 29 Jun 15 olle 750       item.dna = dna;
3432 29 Jun 15 olle 751 */
3432 29 Jun 15 olle 752       if (!item.rna)
3432 29 Jun 15 olle 753       {
3225 02 Apr 15 olle 754         item.rna = rna;
3432 29 Jun 15 olle 755       }
3432 29 Jun 15 olle 756       else if (!item.rna.volume)
3432 29 Jun 15 olle 757       {
3432 29 Jun 15 olle 758         item.rna.volume = rnaDefaultVolume;
3432 29 Jun 15 olle 759       }
3432 29 Jun 15 olle 760       if (!item.dna)
3432 29 Jun 15 olle 761       {
3225 02 Apr 15 olle 762         item.dna = dna;
3432 29 Jun 15 olle 763       }
3432 29 Jun 15 olle 764       else if (!item.dna.volume)
3432 29 Jun 15 olle 765       {
3432 29 Jun 15 olle 766         item.dna.volume = dnaDefaultVolume;
3432 29 Jun 15 olle 767       }
3276 29 Apr 15 olle 768
3432 29 Jun 15 olle 769       // Input extract source item specimen/RNA/DNA
3432 29 Jun 15 olle 770       if (item.bioWell != null)
3432 29 Jun 15 olle 771       {
3432 29 Jun 15 olle 772         storageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3225 02 Apr 15 olle 773       }
3432 29 Jun 15 olle 774       // RNA extract from specimen
3432 29 Jun 15 olle 775       if (item.rna && item.rna.bioWell)
3225 02 Apr 15 olle 776       {
3432 29 Jun 15 olle 777         rnaStorageBox = Strings.encodeTags(item.rna.bioWell.bioPlate.name + '[' + item.rna.bioWell.location + ']');
3225 02 Apr 15 olle 778       }
3432 29 Jun 15 olle 779       // DNA extract from specimen
3432 29 Jun 15 olle 780       if (item.dna && item.dna.bioWell)
3432 29 Jun 15 olle 781       {
3432 29 Jun 15 olle 782         dnaStorageBox = Strings.encodeTags(item.dna.bioWell.bioPlate.name + '[' + item.dna.bioWell.location + ']');
3432 29 Jun 15 olle 783       }
3432 29 Jun 15 olle 784       // Input RNA item storage location should be displayed in the RNA extract storage location column
3432 29 Jun 15 olle 785       if (ExtractUtils.isRna(item) && item.bioWell != null)
3432 29 Jun 15 olle 786       {
3432 29 Jun 15 olle 787         rnaStorageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3432 29 Jun 15 olle 788       }
3432 29 Jun 15 olle 789       // Input DNA item storage location should be displayed in the DNA extract storage location column
3432 29 Jun 15 olle 790       if (ExtractUtils.isDna(item) && item.bioWell != null)
3432 29 Jun 15 olle 791       {
3432 29 Jun 15 olle 792         dnaStorageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3432 29 Jun 15 olle 793       }
3225 02 Apr 15 olle 794       html += '<tr class="highlight">';
3225 02 Apr 15 olle 795       html += '<th>' + Strings.encodeTags(item.name) + '</th>';
3225 02 Apr 15 olle 796       html += '<td id="qiacubePosition'+i+'" class="dottedleft"></td>';
3225 02 Apr 15 olle 797       html += '<td class="dottedleft">'+storageBox+'</td>';
3225 02 Apr 15 olle 798       html += '<td id="rnaPos'+i+'" class="dottedleft"></td>';
3276 29 Apr 15 olle 799       html += '<td id="rnaPlatePos'+i+'" class="dottedleft">'+rnaStorageBox+'</td>';
3225 02 Apr 15 olle 800       if (docType == 'report')
3225 02 Apr 15 olle 801       {
3225 02 Apr 15 olle 802         html += '<td id="rnaVol'+i+'"></td>';
3225 02 Apr 15 olle 803         html += '<td id="rnaConc'+i+'" class="bg-filled-50 italic"></td>';
3225 02 Apr 15 olle 804         html += '<td id="rnaQuantity'+i+'" class="bg-filled-50 italic"></td>';
3276 29 Apr 15 olle 805       }
3276 29 Apr 15 olle 806       html += '<td id="dnaPlatePos'+i+'" class="dottedleft">'+dnaStorageBox+'</td>';
3276 29 Apr 15 olle 807       if (docType == 'report')
3276 29 Apr 15 olle 808       {
3225 02 Apr 15 olle 809         html += '<td id="dnaVol'+i+'"></td>';
3225 02 Apr 15 olle 810         html += '<td id="dnaConc'+i+'" class="bg-filled-50 italic"></td>';
3225 02 Apr 15 olle 811 /*
3352 26 May 15 olle 812         if (ExtractUtils.isSpecimen(item) || ExtractUtils.isDna(item))
3225 02 Apr 15 olle 813         {
3225 02 Apr 15 olle 814           html += '<td><input type="text" id="dnaConc'+i+'" style="width: 5em;"></intput></td>';
3225 02 Apr 15 olle 815         }
3225 02 Apr 15 olle 816         else
3225 02 Apr 15 olle 817         {
3225 02 Apr 15 olle 818           html += '<td id="dnaConc'+i+'">-</td>';
3225 02 Apr 15 olle 819         }
3225 02 Apr 15 olle 820 */
3225 02 Apr 15 olle 821         html += '<td id="dnaQuantity'+i+'" class="bg-filled-50 italic"></td>';
3225 02 Apr 15 olle 822         html += '<td id="deltaCt'+i+'" class="bg-filled-50 italic"></td>';
3225 02 Apr 15 olle 823       }
3225 02 Apr 15 olle 824       html += '<td id="comments'+i+'" class="dottedleft comment"></td>';
3225 02 Apr 15 olle 825       html += '</tr>';
3225 02 Apr 15 olle 826     }
3225 02 Apr 15 olle 827     if (numQiacubeItems == 1 || numQiacubeItems == 11 || numQiacubeItems == 23)
3225 02 Apr 15 olle 828     {
3225 02 Apr 15 olle 829       // Add extra row for counterbalance in QIAcube
3225 02 Apr 15 olle 830       counterBalanceInfoRow = true;
3225 02 Apr 15 olle 831       var i = numItems;
3354 27 May 15 olle 832       var qiacubePos = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems + 1, numQiacubeItems + 1, qiacubeSortedPrefixes);
3225 02 Apr 15 olle 833         
3225 02 Apr 15 olle 834       html += '<tr class="highlight">';
3276 29 Apr 15 olle 835       html += '<th>' + Strings.encodeTags('COUNTER-BALANCE') + '</th>';
3225 02 Apr 15 olle 836       html += '<td id="qiacubePosition'+i+'" class="dottedleft">'+qiacubePos+'</td>';
3225 02 Apr 15 olle 837       html += '<td class="dottedleft">-</td>';
3225 02 Apr 15 olle 838       html += '<td id="rnaPos'+i+'" class="dottedleft">-</td>';
3276 29 Apr 15 olle 839       html += '<td id="rnaPlatePos'+i+'" class="dottedleft">-</td>';
3225 02 Apr 15 olle 840       if (docType == 'report')
3225 02 Apr 15 olle 841       {
3225 02 Apr 15 olle 842         html += '<td id="rnaVol'+i+'">-</td>';
3225 02 Apr 15 olle 843         html += '<td id="rnaConc'+i+'" class="bg-filled-50 italic">-</td>';
3225 02 Apr 15 olle 844         html += '<td id="rnaQuantity'+i+'" class="bg-filled-50 italic">-</td>';
3276 29 Apr 15 olle 845       }
3276 29 Apr 15 olle 846       html += '<td id="dnaPlatePos'+i+'" class="dottedleft">-</td>';
3276 29 Apr 15 olle 847       if (docType == 'report')
3276 29 Apr 15 olle 848       {    
3225 02 Apr 15 olle 849         html += '<td id="dnaVol'+i+'">-</td>';
3225 02 Apr 15 olle 850         html += '<td id="dnaConc'+i+'" class="bg-filled-50 italic">-</td>';
3225 02 Apr 15 olle 851         html += '<td id="dnaQuantity'+i+'" class="bg-filled-50 italic">-</td>';
3225 02 Apr 15 olle 852         html += '<td id="deltaCt'+i+'" class="bg-filled-50 italic">-</td>';
3225 02 Apr 15 olle 853       }
3225 02 Apr 15 olle 854       html += '<td id="comments'+i+'" class="dottedleft comment">Reminder to use counterbalance</td>';
3225 02 Apr 15 olle 855       html += '</tr>';        
3225 02 Apr 15 olle 856     }
3225 02 Apr 15 olle 857     html += '</tbody>';
3225 02 Apr 15 olle 858     html += '</table>';
3225 02 Apr 15 olle 859     Doc.element('detailsSection').innerHTML = html;
3225 02 Apr 15 olle 860     for (var i = 0; i < numItems; i++)
3225 02 Apr 15 olle 861     {
3225 02 Apr 15 olle 862       Events.addEventHandler('dnaConc'+i, 'change', exreg.dnaConcOnChange);
3225 02 Apr 15 olle 863     }
3225 02 Apr 15 olle 864
3225 02 Apr 15 olle 865     Wizard.setCurrentStep(3);
3225 02 Apr 15 olle 866
3432 29 Jun 15 olle 867 /*
3432 29 Jun 15 olle 868     Doc.show('gocancel');
3225 02 Apr 15 olle 869     Doc.show('gocreate');
3225 02 Apr 15 olle 870 */
3225 02 Apr 15 olle 871
3231 08 Apr 15 olle 872     Doc.show('sampleIdFilesSection');
3276 29 Apr 15 olle 873     //var includeSpecExtr = true;
3225 02 Apr 15 olle 874     if (docType == 'report')
3225 02 Apr 15 olle 875     {
3231 08 Apr 15 olle 876       Doc.hide('sampleIdFilesSection');
3276 29 Apr 15 olle 877       //includeSpecExtr = true;
3225 02 Apr 15 olle 878     }
3225 02 Apr 15 olle 879     var url = '../Extraction.servlet?ID='+App.getSessionId();
3432 29 Jun 15 olle 880     url += '&cmd=GetSourceItemListFromStartItemList';
3432 29 Jun 15 olle 881     url += '&startItemListId='+startItemList.value;
3276 29 Apr 15 olle 882     //url += '&includeSpecimenExtracts='+includeSpecExtr;
3276 29 Apr 15 olle 883     url += '&includeSpecimenExtracts=true';
3225 02 Apr 15 olle 884     Wizard.asyncJsonRequest(url, exreg.initializeStep3b);
3225 02 Apr 15 olle 885   }
3225 02 Apr 15 olle 886     
3225 02 Apr 15 olle 887   exreg.initializeStep3b = function(response)
3225 02 Apr 15 olle 888   {
3225 02 Apr 15 olle 889     var frm = document.forms['meludi'];
3352 26 May 15 olle 890     var rnaDefaultVolume = ExtractUtils.getNumber(frm.rnaDefaultVolume.value);
3352 26 May 15 olle 891     var dnaDefaultVolume = ExtractUtils.getNumber(frm.dnaDefaultVolume.value);
3442 21 Jul 15 olle 892     var numQiacubeItems = exreg.getNumberOfSpecimenItems();
3442 21 Jul 15 olle 893     qiacubeSortedPrefixes = exreg.getQiacubeSortedPrefixes();
3442 21 Jul 15 olle 894     var qiacubeItemNo = 0;
3225 02 Apr 15 olle 895
3225 02 Apr 15 olle 896     var docType = frm.formCopyType.value;
3225 02 Apr 15 olle 897     // Set name of form creation button according to document type
3225 02 Apr 15 olle 898     Doc.element('gocreate').innerHTML = '<img src="../images/import.png"></img>Create lab tracking ' + docType;
3225 02 Apr 15 olle 899     Doc.element('gocreate').title = 'Create lab tracking ' + docType;
3225 02 Apr 15 olle 900
3225 02 Apr 15 olle 901     var itemNameNanoDropPosJson = exreg.createItemNameNanoDropPosJson();
3225 02 Apr 15 olle 902     //alert("exreg.initializeStep3b(): itemNameNanoDropPosJson = " + JSON.stringify(itemNameNanoDropPosJson));
3225 02 Apr 15 olle 903
3225 02 Apr 15 olle 904     // Re-load source item list, as items now have more info attached
3225 02 Apr 15 olle 905     var items = response.items;
3225 02 Apr 15 olle 906     var sourceItemList = frm.extractSourceItems;
3225 02 Apr 15 olle 907     if (items.length > 0)
3225 02 Apr 15 olle 908     {
3225 02 Apr 15 olle 909       var numItems = items.length;
3225 02 Apr 15 olle 910       for (var i=0; i < items.length; i++)
3225 02 Apr 15 olle 911       {
3225 02 Apr 15 olle 912         var item = items[i];
3225 02 Apr 15 olle 913 /*
3225 02 Apr 15 olle 914         var name = (i+1) + ': ' + Strings.encodeTags(item.name);
3225 02 Apr 15 olle 915         if (item.bioWell)
3225 02 Apr 15 olle 916         {
3225 02 Apr 15 olle 917           name += ' -- ' + Strings.encodeTags(item.bioWell.bioPlate.name + ' (' + item.bioWell.location +')');
3225 02 Apr 15 olle 918         }
3225 02 Apr 15 olle 919 */
3225 02 Apr 15 olle 920         if (!item.rna)
3225 02 Apr 15 olle 921         {
3225 02 Apr 15 olle 922           var rna = {};
3225 02 Apr 15 olle 923           // RNA
3225 02 Apr 15 olle 924           rna.name = item.name + '.r';
3225 02 Apr 15 olle 925           rna.ndConc = item.ndConc;
3225 02 Apr 15 olle 926           rna.nd260By230 = item.nd260By230;
3225 02 Apr 15 olle 927           rna.nd260By280 = item.nd260By280;
3225 02 Apr 15 olle 928           rna.qubitConc = item.qubitConc;
3225 02 Apr 15 olle 929           rna.deltaCt = item.deltaCt;
3225 02 Apr 15 olle 930           rna.originalQuantity = item.originalQuantity;
3225 02 Apr 15 olle 931           rna.volume = rnaDefaultVolume;        
3225 02 Apr 15 olle 932           rna.well = null;
3225 02 Apr 15 olle 933           item.rna = rna;
3225 02 Apr 15 olle 934         }
3225 02 Apr 15 olle 935         if (!item.dna)
3225 02 Apr 15 olle 936         {
3225 02 Apr 15 olle 937           var dna = {};
3225 02 Apr 15 olle 938           // DNA
3225 02 Apr 15 olle 939           dna.name = item.name + '.d';
3225 02 Apr 15 olle 940           dna.ndConc = item.ndConc;
3225 02 Apr 15 olle 941           dna.nd260By230 = item.nd260By230;
3225 02 Apr 15 olle 942           dna.nd260By280 = item.nd260By280;
3225 02 Apr 15 olle 943           dna.qubitConc = item.qubitConc;
3225 02 Apr 15 olle 944           dna.deltaCt = item.deltaCt;
3225 02 Apr 15 olle 945           dna.originalQuantity = item.originalQuantity;
3225 02 Apr 15 olle 946           dna.volume = dnaDefaultVolume;        
3225 02 Apr 15 olle 947           item.dna = dna;
3225 02 Apr 15 olle 948         }
3225 02 Apr 15 olle 949         // Set RNA well
3276 29 Apr 15 olle 950         item.rna.nanoDropWell = null;
3352 26 May 15 olle 951         if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3225 02 Apr 15 olle 952         {
3225 02 Apr 15 olle 953           var nanoDropPos = itemNameNanoDropPosJson[item.name];
3225 02 Apr 15 olle 954           if (nanoDropPos)
3225 02 Apr 15 olle 955           {
3276 29 Apr 15 olle 956             item.rna.nanoDropWell = nanoDropPos;
3225 02 Apr 15 olle 957           }
3225 02 Apr 15 olle 958         }
3225 02 Apr 15 olle 959         if (docType == 'report')
3225 02 Apr 15 olle 960         {
3352 26 May 15 olle 961           if (ExtractUtils.isSpecimen(item))
3225 02 Apr 15 olle 962           {
3442 21 Jul 15 olle 963             qiacubeItemNo++;
3225 02 Apr 15 olle 964             // Get item QIAcube position from RNA QIAcube instrument prefix and position
3225 02 Apr 15 olle 965             item.qiacubePosition = item.rna.qiacubeInstrumentPrefix + item.rna.qiacubePosition;
3442 21 Jul 15 olle 966             // Special case for extra items, where extract data has not been registered
3442 21 Jul 15 olle 967             if (!item.rna.qiacubePosition)
3442 21 Jul 15 olle 968             {
3442 21 Jul 15 olle 969               item.qiacubePosition = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems, qiacubeItemNo, qiacubeSortedPrefixes);
3442 21 Jul 15 olle 970             }
3225 02 Apr 15 olle 971           }
3352 26 May 15 olle 972           if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3225 02 Apr 15 olle 973           {
3225 02 Apr 15 olle 974             if (item.rna)
3225 02 Apr 15 olle 975             {
3225 02 Apr 15 olle 976             // Get item RNA volume in µl from weight in ng and concentration in ng/µl
3225 02 Apr 15 olle 977             if (item.rna.ndConc && item.rna.ndConc > 0)
3225 02 Apr 15 olle 978             {
3225 02 Apr 15 olle 979               item.rna.volume = (item.rna.originalQuantity * 1000.0)/item.rna.ndConc;
3225 02 Apr 15 olle 980               item.rna.volume = Math.round(item.rna.volume + 0.0001);
3225 02 Apr 15 olle 981             }
3455 29 Jul 15 olle 982             else
3455 29 Jul 15 olle 983             {
3455 29 Jul 15 olle 984               item.rna.volume = frm.rnaDefaultVolume.value;
3225 02 Apr 15 olle 985             }
3455 29 Jul 15 olle 986             }
3225 02 Apr 15 olle 987           }
3352 26 May 15 olle 988           if (ExtractUtils.isSpecimen(item) || ExtractUtils.isDna(item))
3225 02 Apr 15 olle 989           {
3225 02 Apr 15 olle 990             if (item.dna)
3225 02 Apr 15 olle 991             {
3225 02 Apr 15 olle 992             // Get item DNA volume in µl from weight in ng and concentration in ng/µl
3225 02 Apr 15 olle 993             if (item.dna.qubitConc && item.dna.qubitConc > 0)
3225 02 Apr 15 olle 994             {
3225 02 Apr 15 olle 995               item.dna.volume = (item.dna.originalQuantity * 1000.0)/item.dna.qubitConc;
3225 02 Apr 15 olle 996               item.dna.volume = Math.round(item.dna.volume + 0.0001);
3225 02 Apr 15 olle 997             }
3455 29 Jul 15 olle 998             else
3455 29 Jul 15 olle 999             {
3455 29 Jul 15 olle 1000               item.dna.volume = frm.dnaDefaultVolume.value;
3225 02 Apr 15 olle 1001             }
3455 29 Jul 15 olle 1002             }
3225 02 Apr 15 olle 1003           }
3225 02 Apr 15 olle 1004         }
3225 02 Apr 15 olle 1005         else
3225 02 Apr 15 olle 1006         {
3225 02 Apr 15 olle 1007           if (item.rna)
3225 02 Apr 15 olle 1008           {
3225 02 Apr 15 olle 1009             item.rna.volume = frm.rnaDefaultVolume.value;
3225 02 Apr 15 olle 1010             item.rna.ndConc = null;
3225 02 Apr 15 olle 1011             item.rna.originalQuantity = null;
3225 02 Apr 15 olle 1012           }
3225 02 Apr 15 olle 1013
3225 02 Apr 15 olle 1014           if (item.dna)
3225 02 Apr 15 olle 1015           {
3225 02 Apr 15 olle 1016             item.dna.volume = frm.dnaDefaultVolume.value;
3225 02 Apr 15 olle 1017             item.dna.qubitConc = null;
3225 02 Apr 15 olle 1018             item.dna.originalQuantity = null;
3225 02 Apr 15 olle 1019             item.dna.deltaCt = null;
3225 02 Apr 15 olle 1020           }
3225 02 Apr 15 olle 1021         }
3225 02 Apr 15 olle 1022         var selected = true;
3225 02 Apr 15 olle 1023         // Identification of item via id works here as specimens and extracts
3225 02 Apr 15 olle 1024         // are stored in the same database table using discriminators, and are
3225 02 Apr 15 olle 1025         // therefore guaranteed to not have the same id value as another item in the table.
3225 02 Apr 15 olle 1026         var option = new Option(name, item.id, selected, selected);
3225 02 Apr 15 olle 1027         option.item = item;
3225 02 Apr 15 olle 1028         //sourceItemList.options[sourceItemList.length] = option;
3225 02 Apr 15 olle 1029         sourceItemList.options[i] = option;
3225 02 Apr 15 olle 1030       }
3225 02 Apr 15 olle 1031     }
3225 02 Apr 15 olle 1032     else
3225 02 Apr 15 olle 1033     {
3225 02 Apr 15 olle 1034       Wizard.setFatalError('No items available for processing.');
3225 02 Apr 15 olle 1035       return;
3225 02 Apr 15 olle 1036     }
3225 02 Apr 15 olle 1037     
3225 02 Apr 15 olle 1038     exreg.updateDetailsTable();
3225 02 Apr 15 olle 1039     
3225 02 Apr 15 olle 1040     Wizard.setCurrentStep(3);
3231 08 Apr 15 olle 1041
3225 02 Apr 15 olle 1042     Doc.show('gocancel');
3225 02 Apr 15 olle 1043     Doc.show('gocreate');
3225 02 Apr 15 olle 1044     
3225 02 Apr 15 olle 1045     Wizard.keepSessionAlive();
3225 02 Apr 15 olle 1046   }
3225 02 Apr 15 olle 1047
3225 02 Apr 15 olle 1048   exreg.createItemNameNanoDropPosJson = function()
3225 02 Apr 15 olle 1049   {
3225 02 Apr 15 olle 1050     var frm = document.forms['meludi'];
3225 02 Apr 15 olle 1051
3354 27 May 15 olle 1052     qiacubeSortedPrefixes = exreg.getQiacubeSortedPrefixes();
3225 02 Apr 15 olle 1053     // Get list of selected extract source items
3225 02 Apr 15 olle 1054     var selItemsList = exreg.getSelectedItemsList();
3225 02 Apr 15 olle 1055     var numItems = selItemsList.length;
3225 02 Apr 15 olle 1056     var numSpecimenItems = exreg.getNumberOfSpecimenItems();
3432 29 Jun 15 olle 1057     var numQiacubeItems = numSpecimenItems;
3432 29 Jun 15 olle 1058     var totNumItems = numItems;
3225 02 Apr 15 olle 1059     var itemNo = 0;
3225 02 Apr 15 olle 1060     qiacubeItemNo = 0;
3225 02 Apr 15 olle 1061     var nanoDropItemNo = 0;
3225 02 Apr 15 olle 1062     var rnaItemNo = 0;
3225 02 Apr 15 olle 1063     var intNanoDropPlatePosition = 0;
3225 02 Apr 15 olle 1064     // Store NanoDrop positions as JSON object with item names as keys
3225 02 Apr 15 olle 1065     var nanoDropJsonStr = '{';
3225 02 Apr 15 olle 1066     for (var i = 0; i < totNumItems; i++)
3225 02 Apr 15 olle 1067     {
3225 02 Apr 15 olle 1068       itemNo++;
3225 02 Apr 15 olle 1069       var item = null;
3225 02 Apr 15 olle 1070       var qiacubePos = null;
3432 29 Jun 15 olle 1071       item = selItemsList[i];
3432 29 Jun 15 olle 1072       if (ExtractUtils.isSpecimen(item))
3225 02 Apr 15 olle 1073       {
3225 02 Apr 15 olle 1074         qiacubeItemNo++;
3432 29 Jun 15 olle 1075         intNanoDropPlatePosition = qiacubeItemNo;
3354 27 May 15 olle 1076         //qiacubePos = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems, qiacubeItemNo, qiacubeSortedPrefixes);
3225 02 Apr 15 olle 1077       }
3352 26 May 15 olle 1078       if (ExtractUtils.isRna(item))
3225 02 Apr 15 olle 1079       {
3225 02 Apr 15 olle 1080         rnaItemNo++;
3225 02 Apr 15 olle 1081         intNanoDropPlatePosition = numSpecimenItems + rnaItemNo;
3225 02 Apr 15 olle 1082       }
3225 02 Apr 15 olle 1083       
3225 02 Apr 15 olle 1084       // Calculate NanoDrop well from Qiacube position
3225 02 Apr 15 olle 1085       var row;
3225 02 Apr 15 olle 1086       var col;
3225 02 Apr 15 olle 1087       // Specimens from up to two QIAcube instruments and input RNA items placed on one NanoDrop plate
3225 02 Apr 15 olle 1088       if (intNanoDropPlatePosition > 16)
3225 02 Apr 15 olle 1089       {
3225 02 Apr 15 olle 1090         // (17 - 24) NanoDrop plate for secondary QIAcube, positions A3 - H3
3225 02 Apr 15 olle 1091         row = intNanoDropPlatePosition - 17;
3225 02 Apr 15 olle 1092         col = 3;
3225 02 Apr 15 olle 1093       }
3225 02 Apr 15 olle 1094       else if (intNanoDropPlatePosition > 8)
3225 02 Apr 15 olle 1095       {
3225 02 Apr 15 olle 1096         // ( 9 - 12) NanoDrop plate for primary QIAcube, positions A2 - D2
3225 02 Apr 15 olle 1097         // (13 - 16) NanoDrop plate for secondary QIAcube, positions E2 - H2
3225 02 Apr 15 olle 1098         row = intNanoDropPlatePosition - 9;
3225 02 Apr 15 olle 1099         col = 2;
3225 02 Apr 15 olle 1100       }
3225 02 Apr 15 olle 1101       else if (intNanoDropPlatePosition > 0)
3225 02 Apr 15 olle 1102       {
3225 02 Apr 15 olle 1103         // ( 1 -  8) NanoDrop plate for primary QIAcube, positions A1 - H1
3225 02 Apr 15 olle 1104         row = intNanoDropPlatePosition - 1;
3225 02 Apr 15 olle 1105         col = 1;
3225 02 Apr 15 olle 1106       }
3225 02 Apr 15 olle 1107       var nanoDropWell = Meludi.wellToAlpha(row) + col;
3225 02 Apr 15 olle 1108       // Store NanoDrop position as JSON object with item name as key
3225 02 Apr 15 olle 1109       if (nanoDropItemNo > 0)
3225 02 Apr 15 olle 1110       {
3225 02 Apr 15 olle 1111         nanoDropJsonStr += ',';
3225 02 Apr 15 olle 1112       }
3225 02 Apr 15 olle 1113       nanoDropJsonStr += '"' + item.name + '":"' + nanoDropWell + '"';
3225 02 Apr 15 olle 1114       nanoDropItemNo++;
3225 02 Apr 15 olle 1115     }
3225 02 Apr 15 olle 1116     nanoDropJsonStr += '}';
3225 02 Apr 15 olle 1117     return nanoDropJsonStr;
3225 02 Apr 15 olle 1118   }
3225 02 Apr 15 olle 1119
3225 02 Apr 15 olle 1120   exreg.getQiacubeSortedPrefixes = function()
3225 02 Apr 15 olle 1121   {
3225 02 Apr 15 olle 1122     var frm = document.forms['meludi'];
3225 02 Apr 15 olle 1123     var primaryQiacubePrefix = frm.qiacubePrimaryPrefix.value;
3225 02 Apr 15 olle 1124     var secondaryQiacubePrefix = frm.qiacubeSecondaryPrefix.value;
3225 02 Apr 15 olle 1125
3225 02 Apr 15 olle 1126     // Get string of current QIAcube prefixes in order
3354 27 May 15 olle 1127     var sortedPrefixes = ExtractUtils.getQiacubeSortedPrefixes(primaryQiacubePrefix, secondaryQiacubePrefix);
3225 02 Apr 15 olle 1128     return sortedPrefixes;
3225 02 Apr 15 olle 1129   }
3225 02 Apr 15 olle 1130
3225 02 Apr 15 olle 1131   exreg.toggleNormalize = function()
3225 02 Apr 15 olle 1132   {
3225 02 Apr 15 olle 1133     var frm = document.forms['meludi'];
3225 02 Apr 15 olle 1134     // Get list of selected extract source items
3225 02 Apr 15 olle 1135     var selItemsList = exreg.getSelectedItemsList();
3225 02 Apr 15 olle 1136     var numItems = selItemsList.length;
3225 02 Apr 15 olle 1137     // Toggle normalize check box status
3225 02 Apr 15 olle 1138     var check = null;
3225 02 Apr 15 olle 1139     for (var i = 0; i < numItems; i++)
3225 02 Apr 15 olle 1140     {
3225 02 Apr 15 olle 1141       var item = selItemsList[i];
3352 26 May 15 olle 1142       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3225 02 Apr 15 olle 1143       {
3225 02 Apr 15 olle 1144         if (!frm['rnaPreNormalize'+i].disabled)
3225 02 Apr 15 olle 1145         {
3225 02 Apr 15 olle 1146           if (check == null) check = !frm['rnaPreNormalize'+i].checked;
3225 02 Apr 15 olle 1147           frm['rnaPreNormalize'+i].checked = check;
3225 02 Apr 15 olle 1148         }
3225 02 Apr 15 olle 1149       }
3225 02 Apr 15 olle 1150     }
3225 02 Apr 15 olle 1151   }
3225 02 Apr 15 olle 1152   
3225 02 Apr 15 olle 1153   exreg.getSelectedItemsList = function()
3225 02 Apr 15 olle 1154   {
3225 02 Apr 15 olle 1155     var frm = document.forms['meludi'];
3225 02 Apr 15 olle 1156
3225 02 Apr 15 olle 1157     // Get number of selected extract source items
3225 02 Apr 15 olle 1158     var numItems = 0;
3225 02 Apr 15 olle 1159     var selItemsList = [];
3225 02 Apr 15 olle 1160     for (var i = 0; i < frm.extractSourceItems.length; i++)
3225 02 Apr 15 olle 1161     {
3225 02 Apr 15 olle 1162       if (frm.extractSourceItems[i].selected)
3225 02 Apr 15 olle 1163       {
3225 02 Apr 15 olle 1164         if (frm.extractSourceItems[i].item != null)
3225 02 Apr 15 olle 1165         {
3225 02 Apr 15 olle 1166           selItemsList[numItems] = frm.extractSourceItems[i].item;
3225 02 Apr 15 olle 1167           numItems++;
3225 02 Apr 15 olle 1168         }
3225 02 Apr 15 olle 1169       }
3225 02 Apr 15 olle 1170     }
3225 02 Apr 15 olle 1171     return selItemsList;
3225 02 Apr 15 olle 1172   }
3225 02 Apr 15 olle 1173
3225 02 Apr 15 olle 1174   exreg.getNumberOfSpecimenItems = function()
3225 02 Apr 15 olle 1175   {
3225 02 Apr 15 olle 1176     // Get list of selected extract source items
3225 02 Apr 15 olle 1177     var selItemsList = exreg.getSelectedItemsList();
3225 02 Apr 15 olle 1178     var numItems = selItemsList.length;
3225 02 Apr 15 olle 1179     var numSpecimen = 0;
3225 02 Apr 15 olle 1180     for (var i = 0; i < numItems; i++)
3225 02 Apr 15 olle 1181     {
3225 02 Apr 15 olle 1182       var item = selItemsList[i];
3352 26 May 15 olle 1183       if (ExtractUtils.isSpecimen(item))
3225 02 Apr 15 olle 1184       {
3225 02 Apr 15 olle 1185         numSpecimen++;
3225 02 Apr 15 olle 1186       }
3225 02 Apr 15 olle 1187     }
3225 02 Apr 15 olle 1188     return numSpecimen;
3225 02 Apr 15 olle 1189   }
3225 02 Apr 15 olle 1190   
3225 02 Apr 15 olle 1191   exreg.getNumberOfRnaItems = function()
3225 02 Apr 15 olle 1192   {
3225 02 Apr 15 olle 1193     // Get list of selected extract source items
3225 02 Apr 15 olle 1194     var selItemsList = exreg.getSelectedItemsList();
3225 02 Apr 15 olle 1195     var numItems = selItemsList.length;
3225 02 Apr 15 olle 1196     var numRna = 0;
3225 02 Apr 15 olle 1197     for (var i = 0; i < numItems; i++)
3225 02 Apr 15 olle 1198     {
3225 02 Apr 15 olle 1199       var item = selItemsList[i];
3352 26 May 15 olle 1200       if (ExtractUtils.isRna(item))
3225 02 Apr 15 olle 1201       {
3225 02 Apr 15 olle 1202         numRna++;
3225 02 Apr 15 olle 1203       }
3225 02 Apr 15 olle 1204     }
3225 02 Apr 15 olle 1205     return numRna;
3225 02 Apr 15 olle 1206   }
3225 02 Apr 15 olle 1207   
3225 02 Apr 15 olle 1208   exreg.getNumberOfDnaItems = function()
3225 02 Apr 15 olle 1209   {
3225 02 Apr 15 olle 1210     // Get list of selected extract source items
3225 02 Apr 15 olle 1211     var selItemsList = exreg.getSelectedItemsList();
3225 02 Apr 15 olle 1212     var numItems = selItemsList.length;
3225 02 Apr 15 olle 1213     var numDna = 0;
3225 02 Apr 15 olle 1214     for (var i = 0; i < numItems; i++)
3225 02 Apr 15 olle 1215     {
3225 02 Apr 15 olle 1216       var item = selItemsList[i];
3352 26 May 15 olle 1217       if (ExtractUtils.isDna(item))
3225 02 Apr 15 olle 1218       {
3225 02 Apr 15 olle 1219         numDna++;
3225 02 Apr 15 olle 1220       }
3225 02 Apr 15 olle 1221     }
3225 02 Apr 15 olle 1222     return numDna;
3225 02 Apr 15 olle 1223   }
3225 02 Apr 15 olle 1224   
3225 02 Apr 15 olle 1225   exreg.dnaConcOnChange = function(event)
3225 02 Apr 15 olle 1226   {
3225 02 Apr 15 olle 1227     var frm = document.forms['meludi'];
3225 02 Apr 15 olle 1228     // Get list of selected extract source items
3225 02 Apr 15 olle 1229     var selItemsList = exreg.getSelectedItemsList();
3225 02 Apr 15 olle 1230     var numItems = selItemsList.length;
3225 02 Apr 15 olle 1231     // Update DNA concentration values
3225 02 Apr 15 olle 1232     for (var i = 0; i < numItems; i++)
3225 02 Apr 15 olle 1233     {
3225 02 Apr 15 olle 1234       var item = selItemsList[i];
3225 02 Apr 15 olle 1235       var dnaConc = Doc.element('dnaConc'+i);
3225 02 Apr 15 olle 1236       if (dnaConc != null)
3225 02 Apr 15 olle 1237       {
3225 02 Apr 15 olle 1238         if (dnaConc.value != null && dnaConc.value != '' && dnaConc.value != '-')
3225 02 Apr 15 olle 1239         {
3352 26 May 15 olle 1240           item.dna.qubitConc = ExtractUtils.getNumber(dnaConc.value);
3225 02 Apr 15 olle 1241         }
3225 02 Apr 15 olle 1242 /*
3225 02 Apr 15 olle 1243         else
3225 02 Apr 15 olle 1244         {
3225 02 Apr 15 olle 1245           item.dna.qubitConc = null;
3225 02 Apr 15 olle 1246         }
3225 02 Apr 15 olle 1247 */
3225 02 Apr 15 olle 1248       }
3225 02 Apr 15 olle 1249     }
3225 02 Apr 15 olle 1250     exreg.updateDetailsTable();
3225 02 Apr 15 olle 1251   }
3225 02 Apr 15 olle 1252
3225 02 Apr 15 olle 1253   exreg.updateDetailsTable = function()
3225 02 Apr 15 olle 1254   {
3225 02 Apr 15 olle 1255     var frm = document.forms['meludi'];
3225 02 Apr 15 olle 1256     var docType = frm.formCopyType.value;
3352 26 May 15 olle 1257     var rnaDefaultVolume = ExtractUtils.getNumber(frm.rnaDefaultVolume.value);
3352 26 May 15 olle 1258     var dnaDefaultVolume = ExtractUtils.getNumber(frm.dnaDefaultVolume.value);
3225 02 Apr 15 olle 1259     var hasQiacubePosition = [];
3225 02 Apr 15 olle 1260     var duplicatePosition = 0;
3225 02 Apr 15 olle 1261
3354 27 May 15 olle 1262     qiacubeSortedPrefixes = exreg.getQiacubeSortedPrefixes();
3225 02 Apr 15 olle 1263     // Get list of selected extract source items
3225 02 Apr 15 olle 1264     var selItemsList = exreg.getSelectedItemsList();
3225 02 Apr 15 olle 1265     var numItems = selItemsList.length;
3225 02 Apr 15 olle 1266     var numSpecimenItems = exreg.getNumberOfSpecimenItems();
3225 02 Apr 15 olle 1267     var numRnaItems = exreg.getNumberOfRnaItems();
3225 02 Apr 15 olle 1268     var numDnaItems = exreg.getNumberOfDnaItems();
3225 02 Apr 15 olle 1269     var numNanoDropItems = numSpecimenItems + numRnaItems;
3432 29 Jun 15 olle 1270     var numQiacubeItems = numSpecimenItems;
3432 29 Jun 15 olle 1271     var totNumItems = numItems;
3225 02 Apr 15 olle 1272     // Get sorted list of used integer QIAcube positions for specimens, generalized for more than one QIAcube
3225 02 Apr 15 olle 1273     var specSortedIntQiacubePosition = [];
3225 02 Apr 15 olle 1274     var qiacubeItemNo = 0;
3225 02 Apr 15 olle 1275     for (var i = 0; i < totNumItems; i++)
3225 02 Apr 15 olle 1276     {
3432 29 Jun 15 olle 1277       var item = selItemsList[i];
3432 29 Jun 15 olle 1278       if (ExtractUtils.isSpecimen(item))
3225 02 Apr 15 olle 1279       {
3432 29 Jun 15 olle 1280         var qiacubePos = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems, qiacubeItemNo + 1, qiacubeSortedPrefixes);
3432 29 Jun 15 olle 1281         if (docType == 'protocol')
3225 02 Apr 15 olle 1282         {
3432 29 Jun 15 olle 1283           item.qiacubePosition = qiacubePos;
3225 02 Apr 15 olle 1284         }
3354 27 May 15 olle 1285         var intQiacubePosition = ExtractUtils.getIntQiacubePosition(item.qiacubePosition, qiacubeSortedPrefixes);
3225 02 Apr 15 olle 1286         specSortedIntQiacubePosition[qiacubeItemNo] = intQiacubePosition;
3225 02 Apr 15 olle 1287         qiacubeItemNo++;
3225 02 Apr 15 olle 1288       }
3225 02 Apr 15 olle 1289     }
3225 02 Apr 15 olle 1290     // Sort for ascending integer values
3225 02 Apr 15 olle 1291     specSortedIntQiacubePosition.sort(function(a,b){return a-b});
3225 02 Apr 15 olle 1292     var rnaItemNo = 0;
3225 02 Apr 15 olle 1293     var qiacubeItemNo = 0;
3225 02 Apr 15 olle 1294     // Set default values for DNA/RNA extraction
3225 02 Apr 15 olle 1295     for (var i = 0; i < totNumItems; i++)
3225 02 Apr 15 olle 1296     {
3276 29 Apr 15 olle 1297       var rnaStorageBox = '-';
3276 29 Apr 15 olle 1298       var dnaStorageBox = '-';
3225 02 Apr 15 olle 1299       var item = null;
3432 29 Jun 15 olle 1300       item = selItemsList[i];
3432 29 Jun 15 olle 1301       var qiacubePos = null;
3432 29 Jun 15 olle 1302       if (ExtractUtils.isSpecimen(item))
3225 02 Apr 15 olle 1303       {
3432 29 Jun 15 olle 1304         qiacubeItemNo++;
3432 29 Jun 15 olle 1305         qiacubePos = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems, qiacubeItemNo, qiacubeSortedPrefixes);
3432 29 Jun 15 olle 1306         if (docType == 'protocol')
3225 02 Apr 15 olle 1307         {
3432 29 Jun 15 olle 1308           item.qiacubePosition = qiacubePos;
3225 02 Apr 15 olle 1309         }
3432 29 Jun 15 olle 1310       }
3432 29 Jun 15 olle 1311       item.originalQiacubePosition = qiacubePos;
3276 29 Apr 15 olle 1312
3432 29 Jun 15 olle 1313       // RNA extract from specimen
3432 29 Jun 15 olle 1314       if (item.rna && item.rna.bioWell)
3432 29 Jun 15 olle 1315       {
3432 29 Jun 15 olle 1316         rnaStorageBox = Strings.encodeTags(item.rna.bioWell.bioPlate.name + '[' + item.rna.bioWell.location + ']');
3225 02 Apr 15 olle 1317       }
3432 29 Jun 15 olle 1318       // DNA extract from specimen
3432 29 Jun 15 olle 1319       if (item.dna && item.dna.bioWell)
3225 02 Apr 15 olle 1320       {
3432 29 Jun 15 olle 1321         dnaStorageBox = Strings.encodeTags(item.dna.bioWell.bioPlate.name + '[' + item.dna.bioWell.location + ']');
3225 02 Apr 15 olle 1322       }
3432 29 Jun 15 olle 1323       // Input RNA item storage location should be displayed in the RNA extract storage location column
3432 29 Jun 15 olle 1324       if (ExtractUtils.isRna(item) && item.bioWell != null)
3432 29 Jun 15 olle 1325       {
3432 29 Jun 15 olle 1326         rnaStorageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3432 29 Jun 15 olle 1327       }
3432 29 Jun 15 olle 1328       // Input DNA item storage location should be displayed in the DNA extract storage location column
3432 29 Jun 15 olle 1329       if (ExtractUtils.isDna(item) && item.bioWell != null)
3432 29 Jun 15 olle 1330       {
3432 29 Jun 15 olle 1331         dnaStorageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3432 29 Jun 15 olle 1332       }
3225 02 Apr 15 olle 1333       if (Doc.element('qiacubePosition'+i))
3225 02 Apr 15 olle 1334       {
3225 02 Apr 15 olle 1335         Doc.element('qiacubePosition'+i).innerHTML = item.qiacubePosition;
3225 02 Apr 15 olle 1336         Doc.addOrRemoveClass('qiacubePosition'+i, 'nondefault', item.qiacubePosition != item.originalQiacubePosition);
3225 02 Apr 15 olle 1337       }
3225 02 Apr 15 olle 1338
3354 27 May 15 olle 1339       var intQiacubePosition = ExtractUtils.getIntQiacubePosition(item.qiacubePosition, qiacubeSortedPrefixes);      
3225 02 Apr 15 olle 1340       if (intQiacubePosition != null)
3225 02 Apr 15 olle 1341       {
3225 02 Apr 15 olle 1342         if (hasQiacubePosition[intQiacubePosition])
3225 02 Apr 15 olle 1343         {
3225 02 Apr 15 olle 1344           duplicatePosition = intQiacubePosition;
3225 02 Apr 15 olle 1345         }
3225 02 Apr 15 olle 1346         else
3225 02 Apr 15 olle 1347         {
3225 02 Apr 15 olle 1348           hasQiacubePosition[intQiacubePosition] = true;
3225 02 Apr 15 olle 1349         }
3225 02 Apr 15 olle 1350       }
3225 02 Apr 15 olle 1351       var intNanoDropPlatePosition = intQiacubePosition;
3225 02 Apr 15 olle 1352       // Get integer NanoDrop position for specimens from index in sorted list of used integer QIAcube positions
3225 02 Apr 15 olle 1353       if (intQiacubePosition)
3225 02 Apr 15 olle 1354       {
3225 02 Apr 15 olle 1355         var sortIndex = -1;
3225 02 Apr 15 olle 1356         for (var j = 0; j < specSortedIntQiacubePosition.length; j++)
3225 02 Apr 15 olle 1357         {
3225 02 Apr 15 olle 1358           if (intQiacubePosition == specSortedIntQiacubePosition[j])
3225 02 Apr 15 olle 1359           {
3225 02 Apr 15 olle 1360             sortIndex = j;
3225 02 Apr 15 olle 1361           }
3225 02 Apr 15 olle 1362         }
3225 02 Apr 15 olle 1363         if (sortIndex > -1)
3225 02 Apr 15 olle 1364         {
3225 02 Apr 15 olle 1365           intNanoDropPlatePosition = sortIndex + 1;
3225 02 Apr 15 olle 1366         }
3225 02 Apr 15 olle 1367       }
3352 26 May 15 olle 1368       if (ExtractUtils.isRna(item))
3225 02 Apr 15 olle 1369       {
3225 02 Apr 15 olle 1370         rnaItemNo++;
3225 02 Apr 15 olle 1371         intNanoDropPlatePosition = numSpecimenItems + rnaItemNo;
3225 02 Apr 15 olle 1372       }
3225 02 Apr 15 olle 1373       
3225 02 Apr 15 olle 1374       // Calculate NanoDrop well from Qiacube position
3225 02 Apr 15 olle 1375       var row;
3225 02 Apr 15 olle 1376       var col;
3225 02 Apr 15 olle 1377       // Specimens from up to two QIAcube instruments and input RNA items placed on one NanoDrop plate
3225 02 Apr 15 olle 1378       if (intNanoDropPlatePosition > 16)
3225 02 Apr 15 olle 1379       {
3225 02 Apr 15 olle 1380         // (17 - 24) NanoDrop plate for secondary QIAcube, positions A3 - H3
3225 02 Apr 15 olle 1381         row = intNanoDropPlatePosition - 17;
3225 02 Apr 15 olle 1382         col = 3;
3225 02 Apr 15 olle 1383       }
3225 02 Apr 15 olle 1384       else if (intNanoDropPlatePosition > 8)
3225 02 Apr 15 olle 1385       {
3225 02 Apr 15 olle 1386         // ( 9 - 12) NanoDrop plate for primary QIAcube, positions A2 - D2
3225 02 Apr 15 olle 1387         // (13 - 16) NanoDrop plate for secondary QIAcube, positions E2 - H2
3225 02 Apr 15 olle 1388         row = intNanoDropPlatePosition - 9;
3225 02 Apr 15 olle 1389         col = 2;
3225 02 Apr 15 olle 1390       }
3225 02 Apr 15 olle 1391       else if (intNanoDropPlatePosition > 0)
3225 02 Apr 15 olle 1392       {
3225 02 Apr 15 olle 1393         // ( 1 -  8) NanoDrop plate for primary QIAcube, positions A1 - H1
3225 02 Apr 15 olle 1394         row = intNanoDropPlatePosition - 1;
3225 02 Apr 15 olle 1395         col = 1;
3225 02 Apr 15 olle 1396       }
3225 02 Apr 15 olle 1397       var nanoDropWell = Meludi.wellToAlpha(row) + col;
3225 02 Apr 15 olle 1398       if (i < numItems)
3225 02 Apr 15 olle 1399       {
3225 02 Apr 15 olle 1400       
3352 26 May 15 olle 1401         if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3225 02 Apr 15 olle 1402         {
3276 29 Apr 15 olle 1403           item.rna.nanoDropWell = nanoDropWell;
3225 02 Apr 15 olle 1404 /*
3225 02 Apr 15 olle 1405           if (item.rna)
3225 02 Apr 15 olle 1406           {
3225 02 Apr 15 olle 1407             item.rna.well = nanoDropWell;
3225 02 Apr 15 olle 1408           }
3225 02 Apr 15 olle 1409 */
3225 02 Apr 15 olle 1410         }
3225 02 Apr 15 olle 1411         else
3225 02 Apr 15 olle 1412         {
3225 02 Apr 15 olle 1413           if (item.dna)
3225 02 Apr 15 olle 1414           {
3276 29 Apr 15 olle 1415             //item.dna.well = null;
3276 29 Apr 15 olle 1416             item.rna.nanoDropWell = null;
3276 29 Apr 15 olle 1417           }          
3225 02 Apr 15 olle 1418         }
3225 02 Apr 15 olle 1419
3276 29 Apr 15 olle 1420         if (Doc.element('rnaPlatePos'+i))
3276 29 Apr 15 olle 1421         {
3276 29 Apr 15 olle 1422           Doc.element('rnaPlatePos'+i).innerHTML = rnaStorageBox;
3276 29 Apr 15 olle 1423         }
3276 29 Apr 15 olle 1424         if (Doc.element('dnaPlatePos'+i))
3276 29 Apr 15 olle 1425         {
3276 29 Apr 15 olle 1426           Doc.element('dnaPlatePos'+i).innerHTML = dnaStorageBox;
3276 29 Apr 15 olle 1427         }
3225 02 Apr 15 olle 1428         if (item.dna)
3225 02 Apr 15 olle 1429         {
3225 02 Apr 15 olle 1430           if (Doc.element('dnaVol'+i))
3225 02 Apr 15 olle 1431           {
3225 02 Apr 15 olle 1432             Doc.element('dnaVol'+i).innerHTML = item.dna.volume;
3225 02 Apr 15 olle 1433             Doc.addOrRemoveClass('dnaVol'+i, 'nondefault', item.dna.volume != dnaDefaultVolume);
3225 02 Apr 15 olle 1434           }
3225 02 Apr 15 olle 1435           if (Doc.element('dnaConc'+i))
3225 02 Apr 15 olle 1436           {
3225 02 Apr 15 olle 1437             var dnaConc = Doc.element('dnaConc'+i);
3225 02 Apr 15 olle 1438             dnaConc.innerHTML = Meludi.formatNumber(item.dna.qubitConc) || '-';
3225 02 Apr 15 olle 1439             dnaConc.title = '260/280=' + item.dna.nd260by280 + '\n260/230=' + item.dna.nd260by230;
3225 02 Apr 15 olle 1440             if (dnaConc != null)
3225 02 Apr 15 olle 1441             {
3225 02 Apr 15 olle 1442               var dnaConcValue = dnaConc.value;
3225 02 Apr 15 olle 1443               if (dnaConcValue != null && dnaConcValue != '-' && dnaConcValue != '')
3225 02 Apr 15 olle 1444               {
3352 26 May 15 olle 1445                 item.dna.qubitConc = ExtractUtils.getNumber(dnaConcValue);
3225 02 Apr 15 olle 1446               }
3225 02 Apr 15 olle 1447             }
3225 02 Apr 15 olle 1448           }
3225 02 Apr 15 olle 1449           item.dna.quantity = item.dna.qubitConc * item.dna.volume / 1000;
3225 02 Apr 15 olle 1450           if (Doc.element('dnaQuantity'+i))
3225 02 Apr 15 olle 1451           {
3225 02 Apr 15 olle 1452             Doc.element('dnaQuantity'+i).innerHTML = Meludi.formatNumber(item.dna.quantity || null, null, 2) || '-';
3225 02 Apr 15 olle 1453           }
3225 02 Apr 15 olle 1454
3225 02 Apr 15 olle 1455           var deltaCt = Doc.element('deltaCt'+i);
3225 02 Apr 15 olle 1456           if (deltaCt)
3225 02 Apr 15 olle 1457           {
3225 02 Apr 15 olle 1458             var deltaCtValue = deltaCt.value;
3225 02 Apr 15 olle 1459             if (deltaCtValue != null && deltaCtValue != '-' && deltaCtValue != '')
3225 02 Apr 15 olle 1460             {
3352 26 May 15 olle 1461               item.dna.deltaCt = ExtractUtils.getNumber(deltaCtValue);
3225 02 Apr 15 olle 1462             }
3225 02 Apr 15 olle 1463             deltaCt.innerHTML = Meludi.formatNumber(item.dna.deltaCt) || '-';
3225 02 Apr 15 olle 1464           }
3225 02 Apr 15 olle 1465         }
3225 02 Apr 15 olle 1466         else
3225 02 Apr 15 olle 1467         {
3225 02 Apr 15 olle 1468           if (Doc.element('dnaVol'+i))
3225 02 Apr 15 olle 1469           {
3225 02 Apr 15 olle 1470             Doc.element('dnaVol'+i).innerHTML =  dnaDefaultVolume;
3225 02 Apr 15 olle 1471           }
3225 02 Apr 15 olle 1472           if (Doc.element('dnaConc'+i))
3225 02 Apr 15 olle 1473           {
3225 02 Apr 15 olle 1474             var dnaConc = Doc.element('dnaConc'+i);
3225 02 Apr 15 olle 1475             dnaConc.innerHTML = '-';
3225 02 Apr 15 olle 1476             dnaConc.title = '260/280=' + null + '\n260/230=' + null;
3225 02 Apr 15 olle 1477           }
3225 02 Apr 15 olle 1478           if (Doc.element('dnaQuantity'+i))
3225 02 Apr 15 olle 1479           {
3225 02 Apr 15 olle 1480             Doc.element('dnaQuantity'+i).innerHTML = '-';
3225 02 Apr 15 olle 1481           }
3225 02 Apr 15 olle 1482
3225 02 Apr 15 olle 1483           var deltaCt = Doc.element('deltaCt'+i);
3225 02 Apr 15 olle 1484           if (deltaCt)
3225 02 Apr 15 olle 1485           {
3225 02 Apr 15 olle 1486             deltaCt.innerHTML = '-';
3225 02 Apr 15 olle 1487           }
3225 02 Apr 15 olle 1488         }
3225 02 Apr 15 olle 1489
3225 02 Apr 15 olle 1490         if (item.rna)
3225 02 Apr 15 olle 1491         {
3225 02 Apr 15 olle 1492           if (Doc.element('rnaPos'+i))
3225 02 Apr 15 olle 1493           {
3276 29 Apr 15 olle 1494             Doc.element('rnaPos'+i).innerHTML = item.rna.nanoDropWell;
3225 02 Apr 15 olle 1495             Doc.addOrRemoveClass('rnaPos'+i, 'nondefault', item.qiacubePosition != item.originalQiacubePosition);
3225 02 Apr 15 olle 1496           }
3225 02 Apr 15 olle 1497           if (Doc.element('rnaVol'+i))
3225 02 Apr 15 olle 1498           {
3225 02 Apr 15 olle 1499             Doc.element('rnaVol'+i).innerHTML = item.rna.volume;
3225 02 Apr 15 olle 1500             Doc.addOrRemoveClass('rnaVol'+i, 'nondefault', item.rna.volume != rnaDefaultVolume);
3225 02 Apr 15 olle 1501           }
3225 02 Apr 15 olle 1502           if (Doc.element('rnaConc'+i))
3225 02 Apr 15 olle 1503           {
3225 02 Apr 15 olle 1504             var rnaConc = Doc.element('rnaConc'+i);
3225 02 Apr 15 olle 1505             rnaConc.innerHTML = Meludi.formatNumber(item.rna.ndConc) || '-';
3225 02 Apr 15 olle 1506             rnaConc.title = '260/280=' + item.rna.nd260by280 + '\n260/230=' + item.rna.nd260by230;
3225 02 Apr 15 olle 1507           }
3225 02 Apr 15 olle 1508         
3225 02 Apr 15 olle 1509           item.rna.quantity = item.rna.ndConc * item.rna.volume / 1000;
3225 02 Apr 15 olle 1510           var enoughQuantity = item.rna.quantity >= MINIMAL_PRE_NORMALIZE_QUANTITY;
3225 02 Apr 15 olle 1511           item.rna.flag = enoughQuantity ? null : 'NotEnoughRemainingQuantity';
3225 02 Apr 15 olle 1512         
3352 26 May 15 olle 1513           if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3225 02 Apr 15 olle 1514           {
3225 02 Apr 15 olle 1515             if (Doc.element('rnaQuantity'+i))
3225 02 Apr 15 olle 1516             {
3225 02 Apr 15 olle 1517               Doc.element('rnaQuantity'+i).innerHTML = Meludi.formatNumber(item.rna.quantity || null, null, 2) || '-';
3225 02 Apr 15 olle 1518             }
3225 02 Apr 15 olle 1519           }
3225 02 Apr 15 olle 1520         }
3225 02 Apr 15 olle 1521         else
3225 02 Apr 15 olle 1522         {
3225 02 Apr 15 olle 1523           if (Doc.element('rnaPos'+i))
3225 02 Apr 15 olle 1524           {
3352 26 May 15 olle 1525             if (ExtractUtils.isRna(item))
3225 02 Apr 15 olle 1526             {
3225 02 Apr 15 olle 1527               Doc.element('rnaPos'+i).innerHTML = nanoDropWell;
3225 02 Apr 15 olle 1528             }            
3352 26 May 15 olle 1529             if (ExtractUtils.isDna(item))
3225 02 Apr 15 olle 1530             {
3225 02 Apr 15 olle 1531               Doc.element('rnaPos'+i).innerHTML = null;
3225 02 Apr 15 olle 1532             }            
3225 02 Apr 15 olle 1533           }
3225 02 Apr 15 olle 1534           if (Doc.element('rnaVol'+i))
3225 02 Apr 15 olle 1535           {
3225 02 Apr 15 olle 1536             Doc.element('rnaVol'+i).innerHTML = rnaDefaultVolume;
3225 02 Apr 15 olle 1537           }
3225 02 Apr 15 olle 1538           if (Doc.element('rnaConc'+i))
3225 02 Apr 15 olle 1539           {
3225 02 Apr 15 olle 1540             var rnaConc = Doc.element('rnaConc'+i);
3225 02 Apr 15 olle 1541             rnaConc.innerHTML = '-';
3225 02 Apr 15 olle 1542             rnaConc.title = '260/280=' + null + '\n260/230=' + null;
3225 02 Apr 15 olle 1543           }
3225 02 Apr 15 olle 1544         
3352 26 May 15 olle 1545           if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3225 02 Apr 15 olle 1546           {
3225 02 Apr 15 olle 1547             if (Doc.element('rnaQuantity'+i))
3225 02 Apr 15 olle 1548             {
3225 02 Apr 15 olle 1549               Doc.element('rnaQuantity'+i).innerHTML = '-';
3225 02 Apr 15 olle 1550             }
3225 02 Apr 15 olle 1551           }
3225 02 Apr 15 olle 1552         }
3225 02 Apr 15 olle 1553
3225 02 Apr 15 olle 1554         var cmnt = Doc.element('comments'+i);
3225 02 Apr 15 olle 1555         var tooltip = [];
3225 02 Apr 15 olle 1556         var comment = [];
3311 07 May 15 olle 1557         // Update comment data with description data
3311 07 May 15 olle 1558         if (item.description || item.dna.description || item.rna.description)
3225 02 Apr 15 olle 1559         {
3352 26 May 15 olle 1560           if (ExtractUtils.isSpecimen(item))
3311 07 May 15 olle 1561           {          
3311 07 May 15 olle 1562             if (item.description)
3311 07 May 15 olle 1563             {
3311 07 May 15 olle 1564               if (!item.comment)
3311 07 May 15 olle 1565               {
3311 07 May 15 olle 1566                 item.comment = item.description;
3311 07 May 15 olle 1567               }
3311 07 May 15 olle 1568             }
3311 07 May 15 olle 1569             if (item.rna.description)
3311 07 May 15 olle 1570             {
3311 07 May 15 olle 1571               if (!item.rna.comment)
3311 07 May 15 olle 1572               {
3311 07 May 15 olle 1573                 item.rna.comment = item.rna.description;
3311 07 May 15 olle 1574               }
3311 07 May 15 olle 1575             }
3311 07 May 15 olle 1576             if (item.dna.description)
3311 07 May 15 olle 1577             {
3311 07 May 15 olle 1578               if (!item.dna.comment)
3311 07 May 15 olle 1579               {
3311 07 May 15 olle 1580                 item.dna.comment = item.dna.description;
3311 07 May 15 olle 1581               }
3311 07 May 15 olle 1582             }
3311 07 May 15 olle 1583           }
3352 26 May 15 olle 1584           if (ExtractUtils.isRna(item))
3311 07 May 15 olle 1585           {          
3311 07 May 15 olle 1586             if (item.description)
3311 07 May 15 olle 1587             {
3311 07 May 15 olle 1588               if (!item.rna.comment)
3311 07 May 15 olle 1589               {
3311 07 May 15 olle 1590                 item.rna.comment = item.description;
3311 07 May 15 olle 1591               }
3311 07 May 15 olle 1592             }
3311 07 May 15 olle 1593             if (item.rna.description)
3311 07 May 15 olle 1594             {
3311 07 May 15 olle 1595               if (!item.rna.comment)
3311 07 May 15 olle 1596               {
3311 07 May 15 olle 1597                 item.rna.comment = item.rna.description;
3311 07 May 15 olle 1598               }
3311 07 May 15 olle 1599             }
3311 07 May 15 olle 1600           }
3352 26 May 15 olle 1601           if (ExtractUtils.isDna(item))
3311 07 May 15 olle 1602           {          
3311 07 May 15 olle 1603             if (item.description)
3311 07 May 15 olle 1604             {
3311 07 May 15 olle 1605               if (!item.dna.comment)
3311 07 May 15 olle 1606               {
3311 07 May 15 olle 1607                 item.dna.comment = item.description;
3311 07 May 15 olle 1608               }
3311 07 May 15 olle 1609             }
3311 07 May 15 olle 1610             if (item.dna.description)
3311 07 May 15 olle 1611             {
3311 07 May 15 olle 1612               if (!item.dna.comment)
3311 07 May 15 olle 1613               {
3311 07 May 15 olle 1614                 item.dna.comment = item.dna.description;
3311 07 May 15 olle 1615               }
3311 07 May 15 olle 1616             }
3311 07 May 15 olle 1617           }
3311 07 May 15 olle 1618         }
3311 07 May 15 olle 1619         if (item.operatorDeliveryComment || item.comment || item.dna.comment || item.rna.comment)
3311 07 May 15 olle 1620         {
3246 14 Apr 15 olle 1621           // Display operator delivery comments directly in the comment field
3246 14 Apr 15 olle 1622           if (item.operatorDeliveryComment)
3246 14 Apr 15 olle 1623           {
3246 14 Apr 15 olle 1624             comment[0] = item.operatorDeliveryComment;
3246 14 Apr 15 olle 1625             tooltip[tooltip.length] = 'Op.Del.Cmt: ' + item.operatorDeliveryComment;
3246 14 Apr 15 olle 1626           }
3246 14 Apr 15 olle 1627           else
3246 14 Apr 15 olle 1628           {
3246 14 Apr 15 olle 1629             comment[0] = 'Yes';
3246 14 Apr 15 olle 1630           }
3225 02 Apr 15 olle 1631           if (item.comment) tooltip[tooltip.length] = 'Specimen: ' + item.comment;
3311 07 May 15 olle 1632           if (item.rna.comment) tooltip[tooltip.length] = 'RNA: ' + item.rna.comment;
3311 07 May 15 olle 1633           if (item.dna.comment) tooltip[tooltip.length] = 'DNA: ' + item.dna.comment;
3225 02 Apr 15 olle 1634         }
3225 02 Apr 15 olle 1635         
3225 02 Apr 15 olle 1636         var modifiedReagents = false;
3225 02 Apr 15 olle 1637         for (var rgNo = 0; rgNo < exreg.REAGENTS.length; rgNo++)
3225 02 Apr 15 olle 1638         {
3225 02 Apr 15 olle 1639           var rg = exreg.REAGENTS[rgNo];
3225 02 Apr 15 olle 1640           if (item[rg]) 
3225 02 Apr 15 olle 1641           {
3225 02 Apr 15 olle 1642             tooltip[tooltip.length] = Doc.element(rg+'.title').innerHTML + ': ' + Strings.encodeTags(item[rg]);
3225 02 Apr 15 olle 1643             modifiedReagents = true;
3225 02 Apr 15 olle 1644           }
3225 02 Apr 15 olle 1645         }
3225 02 Apr 15 olle 1646         if (modifiedReagents)
3225 02 Apr 15 olle 1647         {
3225 02 Apr 15 olle 1648           comment[comment.length] = 'Reagents';
3225 02 Apr 15 olle 1649         }
3225 02 Apr 15 olle 1650
3225 02 Apr 15 olle 1651         if (cmnt)
3225 02 Apr 15 olle 1652         {        
3225 02 Apr 15 olle 1653           if (tooltip.length > 0)
3225 02 Apr 15 olle 1654           {
3225 02 Apr 15 olle 1655             cmnt.innerHTML = comment.join(', ');
3225 02 Apr 15 olle 1656             Doc.addClass(cmnt, 'nondefault');
3225 02 Apr 15 olle 1657             cmnt.title = tooltip.join('\n');
3225 02 Apr 15 olle 1658           }
3225 02 Apr 15 olle 1659           else
3225 02 Apr 15 olle 1660           {
3225 02 Apr 15 olle 1661             cmnt.innerHTML = '';
3225 02 Apr 15 olle 1662             Doc.removeClass(cmnt, 'nondefault');
3225 02 Apr 15 olle 1663             cmnt.title = null;
3225 02 Apr 15 olle 1664           }
3225 02 Apr 15 olle 1665         }
3225 02 Apr 15 olle 1666       }
3225 02 Apr 15 olle 1667     }
3225 02 Apr 15 olle 1668     
3225 02 Apr 15 olle 1669     if (duplicatePosition)
3225 02 Apr 15 olle 1670     {
3354 27 May 15 olle 1671       var duplicatePositionStr = ExtractUtils.getDetailedQiacubePosition(duplicatePosition, qiacubeSortedPrefixes);
3225 02 Apr 15 olle 1672       qiacubePositionsAreValid = false;
3225 02 Apr 15 olle 1673     }
3225 02 Apr 15 olle 1674     else
3225 02 Apr 15 olle 1675     {
3225 02 Apr 15 olle 1676       qiacubePositionsAreValid = true;
3225 02 Apr 15 olle 1677     }
3225 02 Apr 15 olle 1678   }
3225 02 Apr 15 olle 1679
3225 02 Apr 15 olle 1680   exreg.findRnaOrDnaNanoDrop = function(sampleId, lineNo, messageId)
3225 02 Apr 15 olle 1681   {
3225 02 Apr 15 olle 1682     // Get list of selected extract source items
3225 02 Apr 15 olle 1683     var selItemsList = exreg.getSelectedItemsList();
3225 02 Apr 15 olle 1684     var numItems = selItemsList.length;
3225 02 Apr 15 olle 1685     for (var i = 0; i < numItems; i++)
3225 02 Apr 15 olle 1686     {
3225 02 Apr 15 olle 1687       var item = selItemsList[i];
3225 02 Apr 15 olle 1688       var test_rna_name = item.rna.name;
3225 02 Apr 15 olle 1689       var test_dna_name = item.dna.name;
3352 26 May 15 olle 1690       if (ExtractUtils.isRna(item))
3225 02 Apr 15 olle 1691       {
3225 02 Apr 15 olle 1692         test_rna_name = item.name;
3225 02 Apr 15 olle 1693         test_dna_name = item.name;
3225 02 Apr 15 olle 1694       }
3225 02 Apr 15 olle 1695       if (test_rna_name == sampleId)
3225 02 Apr 15 olle 1696       {
3225 02 Apr 15 olle 1697         return item.rna;
3225 02 Apr 15 olle 1698       }
3225 02 Apr 15 olle 1699       else if (test_dna_name == sampleId)
3225 02 Apr 15 olle 1700       {
3225 02 Apr 15 olle 1701         return item.dna;
3225 02 Apr 15 olle 1702       }
3225 02 Apr 15 olle 1703     }
3225 02 Apr 15 olle 1704     Wizard.setInputStatus(messageId, 'invalid', 'On line ' + lineNo + '; Can\'t find RNA/DNA with name "' + sampleId + '"');
3225 02 Apr 15 olle 1705     return null;
3225 02 Apr 15 olle 1706   }
3225 02 Apr 15 olle 1707
3225 02 Apr 15 olle 1708   exreg.findRnaOrDna = function(sampleId, lineNo, messageId)
3225 02 Apr 15 olle 1709   {
3225 02 Apr 15 olle 1710     // Get list of selected extract source items
3225 02 Apr 15 olle 1711     var selItemsList = exreg.getSelectedItemsList();
3225 02 Apr 15 olle 1712     var numItems = selItemsList.length;
3225 02 Apr 15 olle 1713     for (var i = 0; i < numItems; i++)
3225 02 Apr 15 olle 1714     {
3225 02 Apr 15 olle 1715       var item = selItemsList[i];
3225 02 Apr 15 olle 1716       if (item.rna.name == sampleId)
3225 02 Apr 15 olle 1717       {
3225 02 Apr 15 olle 1718         return item.rna;
3225 02 Apr 15 olle 1719       }
3225 02 Apr 15 olle 1720       else if (item.dna.name == sampleId)
3225 02 Apr 15 olle 1721       {
3225 02 Apr 15 olle 1722         return item.dna;
3225 02 Apr 15 olle 1723       }
3225 02 Apr 15 olle 1724     }
3225 02 Apr 15 olle 1725     Wizard.setInputStatus(messageId, 'invalid', 'On line ' + lineNo + '; Can\'t find RNA/DNA with name "' + sampleId + '"');
3225 02 Apr 15 olle 1726     return null;
3225 02 Apr 15 olle 1727   }
3225 02 Apr 15 olle 1728
3332 12 May 15 olle 1729   exreg.downloadReagentLotNoFile = function()
3332 12 May 15 olle 1730   {
3332 12 May 15 olle 1731     var frm = document.forms['meludi'];
3332 12 May 15 olle 1732     
3332 12 May 15 olle 1733     var reagentInfo = {};
3332 12 May 15 olle 1734     var url = '../Extraction.servlet?ID='+App.getSessionId();
3332 12 May 15 olle 1735     url += '&cmd=DownloadReagentLotNoFile';
3432 29 Jun 15 olle 1736     url += '&startListName='+encodeURIComponent(frm.startListName.value);
3332 12 May 15 olle 1737     url += '&isolationDate='+encodeURIComponent(frm.isolationDate.value);
3332 12 May 15 olle 1738     
3332 12 May 15 olle 1739     // Reagents
3332 12 May 15 olle 1740     for (var i = 0; i < exreg.REAGENTS.length; i++)
3332 12 May 15 olle 1741     {
3332 12 May 15 olle 1742       var rg = exreg.REAGENTS[i];
3332 12 May 15 olle 1743       reagentInfo[rg] = frm[rg].value;
3332 12 May 15 olle 1744     }
3332 12 May 15 olle 1745
3332 12 May 15 olle 1746     url += '&reagentInfo=' + encodeURIComponent(JSON.stringify(reagentInfo));
3332 12 May 15 olle 1747     window.open(url);
3332 12 May 15 olle 1748   }
3332 12 May 15 olle 1749   
3231 08 Apr 15 olle 1750   exreg.downloadSampleIdFile = function()
3231 08 Apr 15 olle 1751   {
3231 08 Apr 15 olle 1752     var frm = document.forms['meludi'];
3231 08 Apr 15 olle 1753
3231 08 Apr 15 olle 1754     if (!qiacubePositionsAreValid)
3231 08 Apr 15 olle 1755     {
3231 08 Apr 15 olle 1756       Forms.showNotification('downloadSampleIdFile', 'QIAcube positions are not valid. Please fix before downloading the file.');
3231 08 Apr 15 olle 1757       return;
3231 08 Apr 15 olle 1758     }
3231 08 Apr 15 olle 1759
3231 08 Apr 15 olle 1760     var itemNames = [];
3231 08 Apr 15 olle 1761     var url = '../Extraction.servlet?ID='+App.getSessionId();
3231 08 Apr 15 olle 1762     url += '&cmd=DownloadNanoDropSampleIdFile';
3432 29 Jun 15 olle 1763     url += '&startListName='+encodeURIComponent(frm.startListName.value);
3231 08 Apr 15 olle 1764     url += '&qiacubeDate='+encodeURIComponent(frm.qiacubeDate.value);
3231 08 Apr 15 olle 1765     url += '&qiacubeRunNo='+encodeURIComponent(frm.qiacubeRunNo.value);
3255 17 Apr 15 olle 1766     url += '&blankControlColumn='+encodeURIComponent(frm.blankControlColumn.checked);
3231 08 Apr 15 olle 1767     
3231 08 Apr 15 olle 1768     // Get list of selected extract source items
3231 08 Apr 15 olle 1769     var selItemsList = exreg.getSelectedItemsList();
3231 08 Apr 15 olle 1770     var numItems = selItemsList.length;
3231 08 Apr 15 olle 1771     var itemNo = 0;
3231 08 Apr 15 olle 1772     for (var i = 0; i < numItems; i++)
3231 08 Apr 15 olle 1773     {
3231 08 Apr 15 olle 1774       var item = selItemsList[i];
3352 26 May 15 olle 1775       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3231 08 Apr 15 olle 1776       {
3231 08 Apr 15 olle 1777         itemNames[itemNo] = item.name;
3231 08 Apr 15 olle 1778         itemNo++;
3231 08 Apr 15 olle 1779       }
3231 08 Apr 15 olle 1780     }
3231 08 Apr 15 olle 1781     url += '&itemNames=' + encodeURIComponent(itemNames.join(','));
3231 08 Apr 15 olle 1782     window.open(url);
3231 08 Apr 15 olle 1783   }
3231 08 Apr 15 olle 1784
3231 08 Apr 15 olle 1785   exreg.downloadQPcrSampleIdFile = function()
3231 08 Apr 15 olle 1786   {
3231 08 Apr 15 olle 1787     var frm = document.forms['meludi'];
3231 08 Apr 15 olle 1788     var itemNames = [];
3231 08 Apr 15 olle 1789     var url = '../Extraction.servlet?ID='+App.getSessionId();
3231 08 Apr 15 olle 1790     url += '&cmd=DownloadQPcrSampleIdFile';
3432 29 Jun 15 olle 1791     url += '&startListName='+encodeURIComponent(frm.startListName.value);
3231 08 Apr 15 olle 1792     url += '&qiacubeDate='+encodeURIComponent(frm.qiacubeDate.value);
3231 08 Apr 15 olle 1793     url += '&qiacubeRunNo='+encodeURIComponent(frm.qiacubeRunNo.value);
3231 08 Apr 15 olle 1794
3231 08 Apr 15 olle 1795     // Get list of selected extract source items
3231 08 Apr 15 olle 1796     var selItemsList = exreg.getSelectedItemsList();
3231 08 Apr 15 olle 1797     var numItems = selItemsList.length;
3231 08 Apr 15 olle 1798     var itemNo = 0;
3231 08 Apr 15 olle 1799     for (var i = 0; i < numItems; i++)
3231 08 Apr 15 olle 1800     {
3231 08 Apr 15 olle 1801       var item = selItemsList[i];
3352 26 May 15 olle 1802       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isDna(item))
3231 08 Apr 15 olle 1803       {
3231 08 Apr 15 olle 1804         itemNames[itemNo] = item.name;
3231 08 Apr 15 olle 1805         itemNo++;
3231 08 Apr 15 olle 1806       }
3231 08 Apr 15 olle 1807     }
3231 08 Apr 15 olle 1808     url += '&itemNames=' + encodeURIComponent(itemNames.join(','));
3231 08 Apr 15 olle 1809     window.open(url);
3231 08 Apr 15 olle 1810   }
3231 08 Apr 15 olle 1811
3225 02 Apr 15 olle 1812   exreg.validateStep3 = function(event)
3225 02 Apr 15 olle 1813   {
3225 02 Apr 15 olle 1814     var valid = true;
3225 02 Apr 15 olle 1815     valid &= nanoDropFileIsValid;
3225 02 Apr 15 olle 1816     valid &= qiacubePositionsAreValid;
3225 02 Apr 15 olle 1817     
3225 02 Apr 15 olle 1818     if (!valid) event.preventDefault();
3225 02 Apr 15 olle 1819   }
3225 02 Apr 15 olle 1820
3225 02 Apr 15 olle 1821   exreg.createProtocol = function()
3225 02 Apr 15 olle 1822   {
3225 02 Apr 15 olle 1823     var frm = document.forms['meludi'];
3225 02 Apr 15 olle 1824     var submitInfo = {};
3225 02 Apr 15 olle 1825     submitInfo.items = [];
3225 02 Apr 15 olle 1826
3225 02 Apr 15 olle 1827     submitInfo.docMode = frm.formCopyType.value;
3225 02 Apr 15 olle 1828     // Get list of selected extract source items
3225 02 Apr 15 olle 1829     var selItemsList = exreg.getSelectedItemsList();
3225 02 Apr 15 olle 1830     var numItems = selItemsList.length;
3432 29 Jun 15 olle 1831     var totNumItems = numItems;
3225 02 Apr 15 olle 1832     for (var i = 0; i < totNumItems; i++)
3225 02 Apr 15 olle 1833     {
3225 02 Apr 15 olle 1834       var item = null;
3432 29 Jun 15 olle 1835       item = selItemsList[i];
3225 02 Apr 15 olle 1836       submitInfo.items[submitInfo.items.length] = item;
3225 02 Apr 15 olle 1837     }
3225 02 Apr 15 olle 1838
3225 02 Apr 15 olle 1839     // Extraction
3432 29 Jun 15 olle 1840     submitInfo.startListName = frm.startListName.value;
3225 02 Apr 15 olle 1841     submitInfo.isolationDate = frm.isolationDate.value;
3501 21 Sep 15 olle 1842     submitInfo.extractionOperator = frm.extractionOperator.value;
3225 02 Apr 15 olle 1843     submitInfo.extractionProtocol = parseInt(frm.extractionProtocolId.value, 10);
3225 02 Apr 15 olle 1844     var extractionProtocolName = frm.extractionProtocolName.value;
3225 02 Apr 15 olle 1845     var protocolVersionNo = '';
3225 02 Apr 15 olle 1846     if (extractionProtocolName)
3225 02 Apr 15 olle 1847     {
3225 02 Apr 15 olle 1848       protocolVersionNo = extractionProtocolName;
3225 02 Apr 15 olle 1849       // Remove part of string up to and including last "v"
3225 02 Apr 15 olle 1850       var vIndex = protocolVersionNo.indexOf('v');
3225 02 Apr 15 olle 1851       while (vIndex >= 0)
3225 02 Apr 15 olle 1852       {
3225 02 Apr 15 olle 1853         // Remove part of string up to and including first "v"
3225 02 Apr 15 olle 1854         protocolVersionNo = protocolVersionNo.substring(vIndex + 1);
3225 02 Apr 15 olle 1855         vIndex = protocolVersionNo.indexOf('v');
3225 02 Apr 15 olle 1856       }
3225 02 Apr 15 olle 1857     }
3225 02 Apr 15 olle 1858     var protocolPreviewFlag = null;
3225 02 Apr 15 olle 1859     submitInfo.extractionProtocolName = extractionProtocolName;
3225 02 Apr 15 olle 1860     submitInfo.protocolVersionNo = protocolVersionNo;
3225 02 Apr 15 olle 1861     submitInfo.protocolPreviewFlag = protocolPreviewFlag;
3352 26 May 15 olle 1862     submitInfo.dnaDefaultVolume = ExtractUtils.getNumber(frm.dnaDefaultVolume.value);
3225 02 Apr 15 olle 1863     if (submitInfo.docMode != 'report')
3225 02 Apr 15 olle 1864     {
3225 02 Apr 15 olle 1865       submitInfo.dnaDefaultVolume = null;
3225 02 Apr 15 olle 1866     }
3501 21 Sep 15 olle 1867     
3501 21 Sep 15 olle 1868     // Specimen reagents
3501 21 Sep 15 olle 1869     submitInfo.xyleneSpecimen = frm.xyleneSpecimen.value;
3501 21 Sep 15 olle 1870     submitInfo.etoh995Specimen = frm.etoh995Specimen.value;
3501 21 Sep 15 olle 1871     submitInfo.allPrepFfpeKit = frm.allPrepFfpeKit.value;
3501 21 Sep 15 olle 1872     submitInfo.bufferPkdSpecimen = frm.bufferPkdSpecimen.value;
3501 21 Sep 15 olle 1873     submitInfo.bufferAtlSpecimen = frm.bufferAtlSpecimen.value;
3436 02 Jul 15 olle 1874     submitInfo.proteinaseKSpecimen = frm.proteinaseKSpecimen.value;
3501 21 Sep 15 olle 1875     submitInfo.rnaseASpecimen = frm.rnaseASpecimen.value;
3501 21 Sep 15 olle 1876
3225 02 Apr 15 olle 1877     // QIAcube
3225 02 Apr 15 olle 1878     submitInfo.qiacubeDate = frm.qiacubeDate.value;
3501 21 Sep 15 olle 1879     submitInfo.qiacubeOperator = frm.qiacubeOperator.value;
3225 02 Apr 15 olle 1880     submitInfo.qiacubeRunNo = parseInt(frm.qiacubeRunNo.value, 10);
3501 21 Sep 15 olle 1881     submitInfo.etoh995 = frm.etoh995.value;
3501 21 Sep 15 olle 1882     submitInfo.bufferRlt = frm.bufferRlt.value;
3501 21 Sep 15 olle 1883     submitInfo.bufferFrn = frm.bufferFrn.value;
3501 21 Sep 15 olle 1884     submitInfo.bufferRpe = frm.bufferRpe.value;
3501 21 Sep 15 olle 1885     submitInfo.bufferAl = frm.bufferAl.value;
3501 21 Sep 15 olle 1886     submitInfo.bufferAw1 = frm.bufferAw1.value;
3501 21 Sep 15 olle 1887     submitInfo.bufferAw2 = frm.bufferAw2.value;
3501 21 Sep 15 olle 1888     submitInfo.bufferAte = frm.bufferAte.value;
3501 21 Sep 15 olle 1889     submitInfo.bufferRdd = frm.bufferRdd.value;
3501 21 Sep 15 olle 1890     submitInfo.rnaseFreeWater = frm.rnaseFreeWater.value;
3501 21 Sep 15 olle 1891     submitInfo.dnaseMix = frm.dnaseMix.value;
3501 21 Sep 15 olle 1892     submitInfo.rneasyMinEluteSpinColumn = frm.rneasyMinEluteSpinColumn.value;
3501 21 Sep 15 olle 1893     submitInfo.qiaampMinEluteSpinColumn = frm.qiaampMinEluteSpinColumn.value;
3225 02 Apr 15 olle 1894
3324 11 May 15 olle 1895     // Quality control reagents
3324 11 May 15 olle 1896     submitInfo.kapaSybrFast = frm.kapaSybrFast.value;
3324 11 May 15 olle 1897     submitInfo.qualityControlPrimersQcpRgt = frm.qualityControlPrimersQcpRgt.value;
3438 03 Jul 15 olle 1898     submitInfo.qualityControlTemplateQct = frm.qualityControlTemplateQct.value;
3324 11 May 15 olle 1899     submitInfo.qubitDnaHighSens = frm.qubitDnaHighSens.value;
3324 11 May 15 olle 1900     submitInfo.qubitDnaBroadRange = frm.qubitDnaBroadRange.value;
3324 11 May 15 olle 1901
3225 02 Apr 15 olle 1902     // Save values in hidden input fields for retrieval after HTML request
3225 02 Apr 15 olle 1903     var submitInfoJsonStr = JSON.stringify(submitInfo);
3225 02 Apr 15 olle 1904     frm.hiddenSubmitInfo.value = submitInfoJsonStr;
3225 02 Apr 15 olle 1905     frm.hiddenNumItems.value = submitInfo.items.length;
3225 02 Apr 15 olle 1906     frm.hiddenCounterBalanceInfoRow.value = counterBalanceInfoRow;
3225 02 Apr 15 olle 1907
3225 02 Apr 15 olle 1908     // Calling frm.submit() will change jsp file to extraction_protocol2.jsp
3225 02 Apr 15 olle 1909     frm.submit();
3225 02 Apr 15 olle 1910   }
3225 02 Apr 15 olle 1911   
3254 17 Apr 15 olle 1912   // Format value as a date in format yyyy-mm-dd
3254 17 Apr 15 olle 1913   exreg.asDate = function(value)
3254 17 Apr 15 olle 1914   {
3254 17 Apr 15 olle 1915     if (!value) return '';
3254 17 Apr 15 olle 1916     if (value.length == 8)
3254 17 Apr 15 olle 1917     {
3254 17 Apr 15 olle 1918       value = value.substr(0, 4) + '-' + value.substr(4, 2) + '-' + value.substr(6, 2);
3254 17 Apr 15 olle 1919     }
3254 17 Apr 15 olle 1920     return value;
3254 17 Apr 15 olle 1921   }
3254 17 Apr 15 olle 1922
3225 02 Apr 15 olle 1923   return exreg;
3225 02 Apr 15 olle 1924 }();
3225 02 Apr 15 olle 1925
3225 02 Apr 15 olle 1926 Doc.onLoad(ExtractionFormCopy.initPage);
3225 02 Apr 15 olle 1927