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

Code
Comments
Other
Rev Date Author Line
3176 06 Mar 15 olle 1 var ExtractionPrep = function()
3176 06 Mar 15 olle 2 {
3176 06 Mar 15 olle 3   var exprep = {};
3176 06 Mar 15 olle 4   var debug = 0;
3176 06 Mar 15 olle 5   
3176 06 Mar 15 olle 6   exprep.REAGENTS = [
3176 06 Mar 15 olle 7     'xyleneSpecimen', 'etoh995Specimen', 'bufferPkdSpecimen', 'bufferAtlSpecimen',
3176 06 Mar 15 olle 8     'proteinaseKSpecimen', 'rnaseASpecimen', 'allPrepFfpeKit', 'etoh995',
3176 06 Mar 15 olle 9     'bufferRlt', 'bufferFrn', 'bufferRpe', 'bufferAl',
3176 06 Mar 15 olle 10     'bufferAw1', 'bufferAw2', 'bufferAte', 'bufferRdd',
3324 11 May 15 olle 11     'rnaseFreeWater', 'dnaseMix', 'rneasyMinEluteSpinColumn', 'qiaampMinEluteSpinColumn',
3438 03 Jul 15 olle 12     'kapaSybrFast', 'qualityControlPrimersQcpRgt', 'qualityControlTemplateQct', 'qubitDnaHighSens', 'qubitDnaBroadRange'
3176 06 Mar 15 olle 13     ];
3176 06 Mar 15 olle 14
3176 06 Mar 15 olle 15   var DEFAULT_RNA_VOLUME = 25;
3234 09 Apr 15 olle 16   var DEFAULT_DNA_VOLUME = 25;
3176 06 Mar 15 olle 17   var MINIMAL_PRE_NORMALIZE_QUANTITY = 1.1; // µg
3180 17 Mar 15 olle 18   var EXTRA_QIACUBE_SAMPLE_NAME_START = 'E';
3176 06 Mar 15 olle 19   var protocolMap = {};
3176 06 Mar 15 olle 20
3180 17 Mar 15 olle 21   var sourceItemListIsValid = false;
3354 27 May 15 olle 22   var qiacubeSortedPrefixes = 'BCADEFGHIJKLMNOPQRSTUVWXYZ';
3180 17 Mar 15 olle 23   var qiacubeDateIsAfterIsolationDate = true;
3176 06 Mar 15 olle 24   var qiacubeRunNoIsValid = false;
3176 06 Mar 15 olle 25   var qiacubePositionsAreValid = false;
3176 06 Mar 15 olle 26   var counterBalanceInfoRow = false;
3432 29 Jun 15 olle 27   var nextStartListName = '';
3336 13 May 15 olle 28   var trackingProtocolPreview = true;
3432 29 Jun 15 olle 29   var createdStartList = [];
3176 06 Mar 15 olle 30   
3176 06 Mar 15 olle 31   // Page initialization
3176 06 Mar 15 olle 32   exprep.initPage = function()
3176 06 Mar 15 olle 33   {
3176 06 Mar 15 olle 34     // Step 1
3176 06 Mar 15 olle 35     Events.addEventHandler('step-1', 'wizard-validate', exprep.validateStep1);
3176 06 Mar 15 olle 36     Events.addEventHandler('extractSourceItems', 'change', exprep.sourceItemsOnChange);
3176 06 Mar 15 olle 37
3176 06 Mar 15 olle 38     // Step 2
3176 06 Mar 15 olle 39     Events.addEventHandler('step-2', 'wizard-initialize', exprep.initializeStep2);
3176 06 Mar 15 olle 40     Events.addEventHandler('step-2', 'wizard-validate', exprep.validateStep2);
3176 06 Mar 15 olle 41     
3180 17 Mar 15 olle 42     Events.addEventHandler('isolationDate', 'change', Wizard.validateDate);
3176 06 Mar 15 olle 43     Events.addEventHandler('qiacubeDate', 'change', Wizard.validateDate);
3180 17 Mar 15 olle 44     Events.addEventHandler('isolationDate', 'change', exprep.qiacubeDateOnChange);
3176 06 Mar 15 olle 45     Events.addEventHandler('qiacubeDate', 'change', exprep.qiacubeDateOnChange);
3176 06 Mar 15 olle 46     Events.addEventHandler('qiacubeRunNo', 'change', exprep.qiacubeRunNoOnChange);
3501 21 Sep 15 olle 47     Events.addEventHandler('reagentFile', 'change', exprep.reagentFileOnChange);
3480 04 Sep 15 olle 48
3501 21 Sep 15 olle 49     Buttons.addClickHandler('downloadReagentLotNoFile', exprep.downloadReagentLotNoFile);
3176 06 Mar 15 olle 50     
3176 06 Mar 15 olle 51     // Step 3
3176 06 Mar 15 olle 52     Events.addEventHandler('step-3', 'wizard-initialize', exprep.initializeStep3);
3176 06 Mar 15 olle 53     Events.addEventHandler('step-3', 'wizard-validate', exprep.validateStep3);
3176 06 Mar 15 olle 54   
3176 06 Mar 15 olle 55     Buttons.addClickHandler('downloadSampleIdFile', exprep.downloadSampleIdFile);
3176 06 Mar 15 olle 56     Buttons.addClickHandler('downloadQPcrSampleIdFile', exprep.downloadQPcrSampleIdFile);
3176 06 Mar 15 olle 57     
3176 06 Mar 15 olle 58     // Navigation
3176 06 Mar 15 olle 59     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
3180 17 Mar 15 olle 60     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
3176 06 Mar 15 olle 61     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
3180 17 Mar 15 olle 62     Buttons.addClickHandler('goregister', Wizard.goRegister);
3176 06 Mar 15 olle 63     Buttons.addClickHandler('gocreate', exprep.createProtocol);
5858 10 Mar 20 olle 64     Buttons.addClickHandler('downloaddnarnalabelfile', exprep.downloadDnaRnaLabelFile);
3176 06 Mar 15 olle 65
3180 17 Mar 15 olle 66     // Final registration
3180 17 Mar 15 olle 67     Events.addEventHandler('wizard', 'wizard-submit', exprep.submit);
3180 17 Mar 15 olle 68
3501 21 Sep 15 olle 69     // Get unprocessed items
3176 06 Mar 15 olle 70     var url = '../Extraction.servlet?ID='+App.getSessionId();
3176 06 Mar 15 olle 71     url += '&cmd=GetUnprocessedItems';    
3176 06 Mar 15 olle 72     Wizard.showLoadingAnimation('Loading unprocessed items...');
3176 06 Mar 15 olle 73     Wizard.asyncJsonRequest(url, exprep.initializeStep1);
3176 06 Mar 15 olle 74   }
3176 06 Mar 15 olle 75   
3176 06 Mar 15 olle 76   exprep.initializeStep1 = function(response)
3176 06 Mar 15 olle 77   {
3176 06 Mar 15 olle 78     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 79     var specimens = response.specimens;
3176 06 Mar 15 olle 80     var rnas = response.rnas;
3176 06 Mar 15 olle 81     var dnas = response.dnas;
3212 27 Mar 15 olle 82     var items = response.items;
3176 06 Mar 15 olle 83     
3176 06 Mar 15 olle 84     var sourceItemList = frm.extractSourceItems;
3212 27 Mar 15 olle 85     if (items.length)
3176 06 Mar 15 olle 86     {
3212 27 Mar 15 olle 87       var numItems = items.length;
3212 27 Mar 15 olle 88       for (var i=0; i < items.length; i++)
3176 06 Mar 15 olle 89       {
3212 27 Mar 15 olle 90         var item = items[i];
3212 27 Mar 15 olle 91         var name = (i+1) + ': ' + Strings.encodeTags(item.name);
3212 27 Mar 15 olle 92         if (item.bioWell)
3176 06 Mar 15 olle 93         {
3212 27 Mar 15 olle 94           name += ' -- ' + Strings.encodeTags(item.bioWell.bioPlate.name + ' (' + item.bioWell.location + ')');
3176 06 Mar 15 olle 95         }
3212 27 Mar 15 olle 96         var selected = i < 24;
3212 27 Mar 15 olle 97         // Identification of item via id works here as specimens and extracts
3212 27 Mar 15 olle 98         // are stored in the same database table using discriminators, and are
3212 27 Mar 15 olle 99         // therefore guaranteed to not have the same id value as another item in the table.
3212 27 Mar 15 olle 100         var option = new Option(name, item.id, selected, selected);
3212 27 Mar 15 olle 101         option.item = item;
3212 27 Mar 15 olle 102         sourceItemList.options[sourceItemList.length] = option;
3176 06 Mar 15 olle 103       }
3176 06 Mar 15 olle 104       exprep.sourceItemsOnChange();
3176 06 Mar 15 olle 105     }
3176 06 Mar 15 olle 106     else
3176 06 Mar 15 olle 107     {
3176 06 Mar 15 olle 108       Wizard.setFatalError('No items available for processing.');
3176 06 Mar 15 olle 109       return;
3176 06 Mar 15 olle 110     }
3176 06 Mar 15 olle 111
3176 06 Mar 15 olle 112     Doc.show('step-1');
3176 06 Mar 15 olle 113     Doc.show('gonext');
3176 06 Mar 15 olle 114   }
3176 06 Mar 15 olle 115
3176 06 Mar 15 olle 116   exprep.sourceItemsOnChange = function()
3176 06 Mar 15 olle 117   {
3176 06 Mar 15 olle 118     sourceItemListIsValid = false;
3176 06 Mar 15 olle 119     Wizard.setInputStatus('extractSourceItems');
3176 06 Mar 15 olle 120     
3176 06 Mar 15 olle 121     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 122     var sourceItemList = frm.extractSourceItems;
3176 06 Mar 15 olle 123     
3176 06 Mar 15 olle 124     var numSelected = 0;
3176 06 Mar 15 olle 125     for (var i = 0; i < sourceItemList.length; i++)
3176 06 Mar 15 olle 126     {
3176 06 Mar 15 olle 127       if (sourceItemList[i].selected) numSelected++;
3176 06 Mar 15 olle 128     }
3176 06 Mar 15 olle 129
3176 06 Mar 15 olle 130     if (numSelected < 1 || numSelected > 24)
3176 06 Mar 15 olle 131     {
3176 06 Mar 15 olle 132       Wizard.setInputStatus('extractSourceItems', 'invalid', 'Must select 1-24 items.');
3176 06 Mar 15 olle 133       return;
3176 06 Mar 15 olle 134     }
3176 06 Mar 15 olle 135     
3176 06 Mar 15 olle 136     sourceItemListIsValid = true;
3176 06 Mar 15 olle 137     Wizard.setInputStatus('extractSourceItems', 'valid');
3176 06 Mar 15 olle 138   }
3176 06 Mar 15 olle 139
3176 06 Mar 15 olle 140   
3245 14 Apr 15 olle 141   exprep.itemNameOnChange = function(event)
3245 14 Apr 15 olle 142   {
3245 14 Apr 15 olle 143     var frm = document.forms['meludi'];
3245 14 Apr 15 olle 144     // Get list of selected extract source items
3245 14 Apr 15 olle 145     var selItemsList = exprep.getSelectedItemsList();
3245 14 Apr 15 olle 146     var numItems = selItemsList.length;
3245 14 Apr 15 olle 147     var numSpecimenItems = exprep.getNumberOfSpecimenItems();
3413 23 Jun 15 olle 148     var numQiacubeItems = numSpecimenItems;
3413 23 Jun 15 olle 149     var totNumItems = numItems;
3245 14 Apr 15 olle 150     exprep.updateDetailsTable();
3245 14 Apr 15 olle 151   }
3245 14 Apr 15 olle 152
3176 06 Mar 15 olle 153   exprep.validateStep1 = function(event)
3176 06 Mar 15 olle 154   {
3413 23 Jun 15 olle 155     if (!sourceItemListIsValid)
3176 06 Mar 15 olle 156     {
3176 06 Mar 15 olle 157       event.preventDefault();
3176 06 Mar 15 olle 158     }
3176 06 Mar 15 olle 159   }
3176 06 Mar 15 olle 160   
3176 06 Mar 15 olle 161   exprep.initializeStep2 = function()
3176 06 Mar 15 olle 162   {
3176 06 Mar 15 olle 163     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 164     frm.extractSourceItems.disabled = true;
3180 17 Mar 15 olle 165 /*
3176 06 Mar 15 olle 166     frm.rnaDefaultVolume.value = DEFAULT_RNA_VOLUME;
3176 06 Mar 15 olle 167     frm.dnaDefaultVolume.value = DEFAULT_DNA_VOLUME;
3180 17 Mar 15 olle 168 */
3501 21 Sep 15 olle 169     var clearButtons = Doc.element('commonInfoSection').getElementsByClassName('clear-reagents');
3501 21 Sep 15 olle 170     if (clearButtons.length > 0)
3501 21 Sep 15 olle 171     {
3501 21 Sep 15 olle 172       Buttons.addClickHandler(clearButtons[0], exprep.clearReagents);
3501 21 Sep 15 olle 173     }
3501 21 Sep 15 olle 174     var copyButtons = Doc.element('commonInfoSection').getElementsByClassName('copy-reagents-from-latest-extract');
3501 21 Sep 15 olle 175     if (copyButtons.length > 0)
3501 21 Sep 15 olle 176     {
3501 21 Sep 15 olle 177       Buttons.addClickHandler(copyButtons[0], exprep.copyReagentsFromLatestExtract);
3501 21 Sep 15 olle 178     }
3176 06 Mar 15 olle 179     
3176 06 Mar 15 olle 180     Wizard.setCurrentStep(2);
3176 06 Mar 15 olle 181     Doc.show('gocancel');
3176 06 Mar 15 olle 182     Doc.show('gonext');
3176 06 Mar 15 olle 183
3176 06 Mar 15 olle 184     Meludi.loadProtocols('SAMPLE_HANDLING_PROTOCOL', 'extractionProtocol');
3176 06 Mar 15 olle 185     Doc.addClass('extractionProtocol', 'list-loading');
3176 06 Mar 15 olle 186     frm.extractionProtocol[0] = new Option('loading...', '');
3501 21 Sep 15 olle 187
3501 21 Sep 15 olle 188     // Get extraction protocol
3176 06 Mar 15 olle 189     var url = '../Protocol.servlet?ID='+App.getSessionId();
3176 06 Mar 15 olle 190     url += '&cmd=GetProtocols&subtype=EXTRACTION_PROTOCOL';
3176 06 Mar 15 olle 191     Wizard.asyncJsonRequest(url, exprep.protocolsLoaded);
3176 06 Mar 15 olle 192
3180 17 Mar 15 olle 193     frm.isolationDate.focus();
3180 17 Mar 15 olle 194     Events.sendChangeEvent('isolationDate');
3176 06 Mar 15 olle 195     Events.sendChangeEvent('qiacubeDate');
3176 06 Mar 15 olle 196   }
3176 06 Mar 15 olle 197   
3176 06 Mar 15 olle 198   exprep.protocolsLoaded = function(response)
3176 06 Mar 15 olle 199   {
3176 06 Mar 15 olle 200     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 201     var protocols = response.protocols;
3176 06 Mar 15 olle 202
3176 06 Mar 15 olle 203     Doc.removeClass('extractionProtocol', 'list-loading');
3176 06 Mar 15 olle 204     frm.extractionProtocol.length = 0;
3176 06 Mar 15 olle 205     for (var i = 0; i < protocols.length; i++)
3176 06 Mar 15 olle 206     {
3176 06 Mar 15 olle 207       var name = protocols[i].name;
3176 06 Mar 15 olle 208       var id = protocols[i].id;
3176 06 Mar 15 olle 209       protocolMap[id] = name;
3202 19 Mar 15 olle 210       frm.extractionProtocol[frm.extractionProtocol.length] = new Option(name, id, false, true);
3202 19 Mar 15 olle 211     }    
3176 06 Mar 15 olle 212     frm.extractionProtocol[frm.extractionProtocol.length] = new Option('- none -', '');
3176 06 Mar 15 olle 213
3501 21 Sep 15 olle 214     // Get reagent lot numbers from last processed DNA
3176 06 Mar 15 olle 215     var url = '../Extraction.servlet?ID='+App.getSessionId();
3180 17 Mar 15 olle 216     url += '&cmd=GetLastProcessedDna';
3501 21 Sep 15 olle 217     Wizard.asyncJsonRequest(url, exprep.lastProcessedDnaLoadedInit);
3176 06 Mar 15 olle 218   }
3176 06 Mar 15 olle 219   
3501 21 Sep 15 olle 220   exprep.lastProcessedDnaLoadedInit = function(response)
3176 06 Mar 15 olle 221   {
3501 21 Sep 15 olle 222     // Update reagent lot number fields with values from last processed DNA
3501 21 Sep 15 olle 223     exprep.lastProcessedDnaLoaded(response);
3180 17 Mar 15 olle 224
3501 21 Sep 15 olle 225     // Get next start list name
3180 17 Mar 15 olle 226     var url = '../Extraction.servlet?ID='+App.getSessionId();
3432 29 Jun 15 olle 227     url += '&cmd=GetNextStartListName';
3432 29 Jun 15 olle 228     Wizard.asyncJsonRequest(url, exprep.startListNameLoaded);
3176 06 Mar 15 olle 229   }
3176 06 Mar 15 olle 230   
3432 29 Jun 15 olle 231   exprep.startListNameLoaded = function(response)
3180 17 Mar 15 olle 232   {
3180 17 Mar 15 olle 233     var frm = document.forms['meludi'];
3432 29 Jun 15 olle 234     var nextStartListName = response.nextStartListName;
3432 29 Jun 15 olle 235     frm.startListName.value = nextStartListName;
3180 17 Mar 15 olle 236   }
3180 17 Mar 15 olle 237   
3501 21 Sep 15 olle 238   exprep.clearReagents = function()
3480 04 Sep 15 olle 239   {
3480 04 Sep 15 olle 240     var frm = document.forms['meludi'];
3501 21 Sep 15 olle 241
3501 21 Sep 15 olle 242     // Clear reagent values
3501 21 Sep 15 olle 243
3501 21 Sep 15 olle 244     // FFPE DNA/RNA Kit
3501 21 Sep 15 olle 245     frm.allPrepFfpeKit.value = null;
3501 21 Sep 15 olle 246
3501 21 Sep 15 olle 247     // Specimen reagents
3501 21 Sep 15 olle 248     frm.xyleneSpecimen.value = null;
3501 21 Sep 15 olle 249     frm.etoh995Specimen.value = null;
3501 21 Sep 15 olle 250     frm.bufferPkdSpecimen.value = null;
3501 21 Sep 15 olle 251     frm.bufferAtlSpecimen.value = null;
3501 21 Sep 15 olle 252     frm.proteinaseKSpecimen.value = null;
3501 21 Sep 15 olle 253     frm.rnaseASpecimen.value = null;
3501 21 Sep 15 olle 254
3501 21 Sep 15 olle 255     // QIAcube reagents
3501 21 Sep 15 olle 256     frm.etoh995.value = null;
3501 21 Sep 15 olle 257     frm.bufferRlt.value = null;
3501 21 Sep 15 olle 258     frm.bufferFrn.value = null;
3501 21 Sep 15 olle 259     frm.bufferRpe.value = null;
3501 21 Sep 15 olle 260     frm.bufferAl.value = null;
3501 21 Sep 15 olle 261     frm.bufferAw1.value = null;
3501 21 Sep 15 olle 262     frm.bufferAw2.value = null;
3501 21 Sep 15 olle 263     frm.bufferAte.value = null;
3501 21 Sep 15 olle 264     frm.bufferRdd.value = null;
3501 21 Sep 15 olle 265     frm.rnaseFreeWater.value = null;
3501 21 Sep 15 olle 266     frm.dnaseMix.value = null;
3501 21 Sep 15 olle 267     frm.rneasyMinEluteSpinColumn.value = null;
3501 21 Sep 15 olle 268     frm.qiaampMinEluteSpinColumn.value = null;
3501 21 Sep 15 olle 269
3501 21 Sep 15 olle 270     // Quality control reagents
3501 21 Sep 15 olle 271     frm.kapaSybrFast.value = null;
3501 21 Sep 15 olle 272     frm.qualityControlPrimersQcpRgt.value = null;
3501 21 Sep 15 olle 273     frm.qualityControlTemplateQct.value = null;
3501 21 Sep 15 olle 274     frm.qubitDnaHighSens.value = null;
3501 21 Sep 15 olle 275     frm.qubitDnaBroadRange.value = null;
3501 21 Sep 15 olle 276   }
3501 21 Sep 15 olle 277
3501 21 Sep 15 olle 278   exprep.copyReagentsFromLatestExtract = function()
3501 21 Sep 15 olle 279   {
3480 04 Sep 15 olle 280     var url = '../Extraction.servlet?ID='+App.getSessionId();
3480 04 Sep 15 olle 281     url += '&cmd=GetLastProcessedDna';
3501 21 Sep 15 olle 282     Wizard.asyncJsonRequest(url, exprep.lastProcessedDnaLoaded);
3480 04 Sep 15 olle 283   }
3501 21 Sep 15 olle 284
3501 21 Sep 15 olle 285   exprep.lastProcessedDnaLoaded = function(response)
3480 04 Sep 15 olle 286   {
3480 04 Sep 15 olle 287     var frm = document.forms['meludi'];
3480 04 Sep 15 olle 288     var dnas = response.dnas;
3480 04 Sep 15 olle 289
3480 04 Sep 15 olle 290     if (dnas.length > 0)
3480 04 Sep 15 olle 291     {
3501 21 Sep 15 olle 292       var dna = dnas[0];
3480 04 Sep 15 olle 293
3501 21 Sep 15 olle 294       // Reset the existing values
3480 04 Sep 15 olle 295
3501 21 Sep 15 olle 296       // FFPE DNA/RNA Kit
3501 21 Sep 15 olle 297       var allPrepFfpeKit = '';
3480 04 Sep 15 olle 298
3501 21 Sep 15 olle 299       // Specimen reagents
3501 21 Sep 15 olle 300       var specXylene = '';
3501 21 Sep 15 olle 301       var specEtoh995 = '';
3501 21 Sep 15 olle 302       var specBufferPkd = '';
3501 21 Sep 15 olle 303       var specBufferAtl = '';
3501 21 Sep 15 olle 304       var specProteinaseK = '';
3501 21 Sep 15 olle 305       var specRNAseA = '';
3501 21 Sep 15 olle 306
3501 21 Sep 15 olle 307       // QIAcube reagents
3501 21 Sep 15 olle 308       var bufferRlt = '';
3501 21 Sep 15 olle 309       var etoh995 = '';
3501 21 Sep 15 olle 310       var bufferFrn = '';
3501 21 Sep 15 olle 311       var bufferRpe = '';
3501 21 Sep 15 olle 312       var rnaseFreeWater = '';
3501 21 Sep 15 olle 313       var dnaseMix = '';
3501 21 Sep 15 olle 314       var bufferRdd = '';
3501 21 Sep 15 olle 315       var rneasyMinEluteSpinColumn = '';
3501 21 Sep 15 olle 316       var bufferAl = '';
3501 21 Sep 15 olle 317       var bufferAW1 = '';
3501 21 Sep 15 olle 318       var bufferAW2 = '';
3501 21 Sep 15 olle 319       var bufferAte = '';
3501 21 Sep 15 olle 320       var qiaampMinEluteSpinColumn = '';
3501 21 Sep 15 olle 321
3501 21 Sep 15 olle 322       // Quality control reagents
3501 21 Sep 15 olle 323       var kapaSybrFast = '';
3501 21 Sep 15 olle 324       var qualityControlPrimersQcpRgt = '';
3501 21 Sep 15 olle 325       var qualityControlTemplateQct = '';
3501 21 Sep 15 olle 326       var qubitDnaHighSens = '';
3501 21 Sep 15 olle 327       var qubitDnaBroadRange = '';
3501 21 Sep 15 olle 328
3501 21 Sep 15 olle 329       if (dna) 
3501 21 Sep 15 olle 330       {
3501 21 Sep 15 olle 331         // FFPE DNA/RNA Kit
3501 21 Sep 15 olle 332         allPrepFfpeKit = dna.allPrepFfpeKit;
3501 21 Sep 15 olle 333
3480 04 Sep 15 olle 334         // Specimen reagents
3501 21 Sep 15 olle 335         specXylene = dna.xyleneSpecimen;
3501 21 Sep 15 olle 336         specEtoh995 = dna.etoh995Specimen;
3501 21 Sep 15 olle 337         specBufferPkd = dna.bufferPkdSpecimen;
3501 21 Sep 15 olle 338         specBufferAtl = dna.bufferAtlSpecimen;
3501 21 Sep 15 olle 339         specProteinaseK = dna.proteinaseKSpecimen;
3501 21 Sep 15 olle 340         specRNAseA = dna.rnaseASpecimen;
3480 04 Sep 15 olle 341
3480 04 Sep 15 olle 342         // QIAcube reagents
3501 21 Sep 15 olle 343         bufferRlt = dna.bufferRlt;
3501 21 Sep 15 olle 344         etoh995 = dna.etoh995;
3501 21 Sep 15 olle 345         bufferFrn = dna.bufferFrn;
3501 21 Sep 15 olle 346         bufferRpe = dna.bufferRpe;
3501 21 Sep 15 olle 347         rnaseFreeWater = dna.rnaseFreeWater;
3501 21 Sep 15 olle 348         dnaseMix = dna.dnaseMix;
3501 21 Sep 15 olle 349         bufferRdd = dna.bufferRdd;
3501 21 Sep 15 olle 350         rneasyMinEluteSpinColumn = dna.rneasyMinEluteSpinColumn;
3501 21 Sep 15 olle 351         bufferAl = dna.bufferAl;
3501 21 Sep 15 olle 352         bufferAW1 = dna.bufferAw1;
3501 21 Sep 15 olle 353         bufferAW2 = dna.bufferAw2;
3501 21 Sep 15 olle 354         bufferAte = dna.bufferAte;
3501 21 Sep 15 olle 355         qiaampMinEluteSpinColumn = dna.qiaampMinEluteSpinColumn;
3480 04 Sep 15 olle 356
3501 21 Sep 15 olle 357         // Quality control reagents
3501 21 Sep 15 olle 358         kapaSybrFast = dna.kapaSybrFast;
3501 21 Sep 15 olle 359         qualityControlPrimersQcpRgt = dna.qualityControlPrimersQcpRgt;
3501 21 Sep 15 olle 360         qualityControlTemplateQct = dna.qualityControlTemplateQct;
3501 21 Sep 15 olle 361         qubitDnaHighSens = dna.qubitDnaHighSens;
3501 21 Sep 15 olle 362         qubitDnaBroadRange = dna.qubitDnaBroadRange;
3501 21 Sep 15 olle 363       }
3480 04 Sep 15 olle 364
3501 21 Sep 15 olle 365       // Update reagent values
3480 04 Sep 15 olle 366
3501 21 Sep 15 olle 367       // FFPE DNA/RNA Kit
3501 21 Sep 15 olle 368       if (frm.allPrepFfpeKit.value == null || frm.allPrepFfpeKit.value == '')
3501 21 Sep 15 olle 369       {
3501 21 Sep 15 olle 370         frm.allPrepFfpeKit.value = allPrepFfpeKit;
3501 21 Sep 15 olle 371       }
3480 04 Sep 15 olle 372
3501 21 Sep 15 olle 373       // Specimen reagents
3501 21 Sep 15 olle 374       frm.xyleneSpecimen.value = specXylene;
3501 21 Sep 15 olle 375       frm.etoh995Specimen.value = specEtoh995;
3501 21 Sep 15 olle 376       frm.bufferPkdSpecimen.value = specBufferPkd;
3501 21 Sep 15 olle 377       frm.bufferAtlSpecimen.value = specBufferAtl;
3501 21 Sep 15 olle 378       frm.proteinaseKSpecimen.value = specProteinaseK;
3501 21 Sep 15 olle 379       frm.rnaseASpecimen.value = specRNAseA;
3480 04 Sep 15 olle 380
3501 21 Sep 15 olle 381       // QIAcube reagents
3501 21 Sep 15 olle 382       frm.etoh995.value = etoh995;
3501 21 Sep 15 olle 383       frm.bufferRlt.value = bufferRlt;
3501 21 Sep 15 olle 384       frm.bufferFrn.value = bufferFrn;
3501 21 Sep 15 olle 385       frm.bufferRpe.value = bufferRpe;
3501 21 Sep 15 olle 386       frm.bufferAl.value = bufferAl;
3501 21 Sep 15 olle 387       frm.bufferAw1.value = bufferAW1;
3501 21 Sep 15 olle 388       frm.bufferAw2.value = bufferAW2;
3501 21 Sep 15 olle 389       frm.bufferAte.value = bufferAte;
3501 21 Sep 15 olle 390       frm.bufferRdd.value = bufferRdd;
3501 21 Sep 15 olle 391       frm.rnaseFreeWater.value = rnaseFreeWater;
3501 21 Sep 15 olle 392       frm.dnaseMix.value = dnaseMix;
3501 21 Sep 15 olle 393       frm.rneasyMinEluteSpinColumn.value = rneasyMinEluteSpinColumn;
3501 21 Sep 15 olle 394       frm.qiaampMinEluteSpinColumn.value = qiaampMinEluteSpinColumn;
3480 04 Sep 15 olle 395
3501 21 Sep 15 olle 396       // Quality control reagents
3501 21 Sep 15 olle 397       frm.kapaSybrFast.value = kapaSybrFast;
3501 21 Sep 15 olle 398       frm.qualityControlPrimersQcpRgt.value = qualityControlPrimersQcpRgt;
3501 21 Sep 15 olle 399       frm.qualityControlTemplateQct.value = qualityControlTemplateQct;
3501 21 Sep 15 olle 400       frm.qubitDnaHighSens.value = qubitDnaHighSens;
3501 21 Sep 15 olle 401       frm.qubitDnaBroadRange.value = qubitDnaBroadRange;
3480 04 Sep 15 olle 402     }
3501 21 Sep 15 olle 403   }
3480 04 Sep 15 olle 404
3176 06 Mar 15 olle 405   exprep.qiacubeDateOnChange = function()
3176 06 Mar 15 olle 406   {
3176 06 Mar 15 olle 407     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 408     
3180 17 Mar 15 olle 409     var isolationDateIsValid = Wizard.isValid('isolationDate');
3176 06 Mar 15 olle 410     var qiacubeDateIsValid = Wizard.isValid('qiacubeDate');
3176 06 Mar 15 olle 411     
3180 17 Mar 15 olle 412     if (!isolationDateIsValid || !qiacubeDateIsValid) return;
3176 06 Mar 15 olle 413
3180 17 Mar 15 olle 414     var isolationDate = Dates.parseString(frm.isolationDate.value, 'yyyyMMdd');
3176 06 Mar 15 olle 415     var qiacubeDate = Dates.parseString(frm.qiacubeDate.value, 'yyyyMMdd');
3180 17 Mar 15 olle 416     if (isolationDate > qiacubeDate)
3176 06 Mar 15 olle 417     {
3180 17 Mar 15 olle 418       Wizard.setInputStatus('qiacubeDate', 'invalid', 'QIAcube date is before isolation date');
3180 17 Mar 15 olle 419       qiacubeDateIsAfterIsolationDate = false;
3176 06 Mar 15 olle 420       return;
3176 06 Mar 15 olle 421     }
3176 06 Mar 15 olle 422
3180 17 Mar 15 olle 423     qiacubeDateIsAfterIsolationDate = true;
3176 06 Mar 15 olle 424
3176 06 Mar 15 olle 425     Wizard.setInputStatus('qiacubeDate', 'valid');
3176 06 Mar 15 olle 426     var url = '../Extraction.servlet?ID='+App.getSessionId();
3176 06 Mar 15 olle 427     url += '&cmd=GetNextQiacubeRunNo&qiacubeDate='+encodeURIComponent(frm.qiacubeDate.value);
3176 06 Mar 15 olle 428     Wizard.showLoadingAnimation('Loading Qiacube run number...');
3176 06 Mar 15 olle 429     Wizard.asyncJsonRequest(url, exprep.gotNextRunNumber);
3176 06 Mar 15 olle 430   }
3176 06 Mar 15 olle 431
3176 06 Mar 15 olle 432   exprep.gotNextRunNumber = function(response)
3176 06 Mar 15 olle 433   {
3176 06 Mar 15 olle 434     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 435     frm.qiacubeRunNo.value = response.nextQiacubeRunNo;
3176 06 Mar 15 olle 436     Events.sendChangeEvent('qiacubeRunNo');
3176 06 Mar 15 olle 437   }
3176 06 Mar 15 olle 438
3176 06 Mar 15 olle 439   exprep.qiacubeRunNoOnChange = function()
3176 06 Mar 15 olle 440   {
3176 06 Mar 15 olle 441     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 442     var runNumber = frm.qiacubeRunNo.value;
3176 06 Mar 15 olle 443     qiacubeRunNoIsValid = false;
3176 06 Mar 15 olle 444
3176 06 Mar 15 olle 445     if (runNumber == '')
3176 06 Mar 15 olle 446     {
3176 06 Mar 15 olle 447       Wizard.setInputStatus('qiacubeRunNo', 'invalid', 'Missing');
3176 06 Mar 15 olle 448       return;
3176 06 Mar 15 olle 449     }
3176 06 Mar 15 olle 450     if (!(parseInt(runNumber, 10) >= 1))
3176 06 Mar 15 olle 451     {
3176 06 Mar 15 olle 452       Wizard.setInputStatus('qiacubeRunNo', 'invalid', 'Must be at least 1');
3176 06 Mar 15 olle 453       return;    
3176 06 Mar 15 olle 454     }
3176 06 Mar 15 olle 455     
3176 06 Mar 15 olle 456     Wizard.setInputStatus('qiacubeRunNo', 'valid');
3176 06 Mar 15 olle 457     qiacubeRunNoIsValid = true;
3176 06 Mar 15 olle 458   }
3176 06 Mar 15 olle 459
3501 21 Sep 15 olle 460   exprep.reagentFileOnChange = function()
3501 21 Sep 15 olle 461   {
3501 21 Sep 15 olle 462     var frm = document.forms['meludi'];
3501 21 Sep 15 olle 463     var file = frm.reagentFile.files[0];
3501 21 Sep 15 olle 464     
3501 21 Sep 15 olle 465     var reader = new FileReader();
3501 21 Sep 15 olle 466     reader.onload = exprep.reagentFileLoaded;
3501 21 Sep 15 olle 467     reader.readAsText(file);
3501 21 Sep 15 olle 468   }
3501 21 Sep 15 olle 469
3501 21 Sep 15 olle 470   exprep.reagentFileLoaded = function(event)
3501 21 Sep 15 olle 471   {
3501 21 Sep 15 olle 472     exprep.parseReagentFile(event.target.result);
3501 21 Sep 15 olle 473   }
3501 21 Sep 15 olle 474
3501 21 Sep 15 olle 475   exprep.parseReagentFile = function(data)
3501 21 Sep 15 olle 476   {
3501 21 Sep 15 olle 477     var frm = document.forms['meludi'];
3501 21 Sep 15 olle 478     reagentFileIsValid = false;
3501 21 Sep 15 olle 479
3501 21 Sep 15 olle 480     var numReagentItems = 0;
3501 21 Sep 15 olle 481     // Reset the existing values
3501 21 Sep 15 olle 482
3501 21 Sep 15 olle 483     // FFPE DNA/RNA Kit
3501 21 Sep 15 olle 484     var allPrepFfpeKit = '';
3501 21 Sep 15 olle 485
3501 21 Sep 15 olle 486     // Specimen reagents
3501 21 Sep 15 olle 487     var specXylene = '';
3501 21 Sep 15 olle 488     var specEtoh995 = '';
3501 21 Sep 15 olle 489     var specBufferPkd = '';
3501 21 Sep 15 olle 490     var specBufferAtl = '';
3501 21 Sep 15 olle 491     var specProteinaseK = '';
3501 21 Sep 15 olle 492     var specRNAseA = '';
3501 21 Sep 15 olle 493
3501 21 Sep 15 olle 494     // QIAcube reagents
3501 21 Sep 15 olle 495     var bufferRlt = '';
3501 21 Sep 15 olle 496     var etoh995 = '';
3501 21 Sep 15 olle 497     var bufferFrn = '';
3501 21 Sep 15 olle 498     var bufferRpe = '';
3501 21 Sep 15 olle 499     var rnaseFreeWater = '';
3501 21 Sep 15 olle 500     var dnaseMix = '';
3501 21 Sep 15 olle 501     var bufferRdd = '';
3501 21 Sep 15 olle 502     var rneasyMinEluteSpinColumn = '';
3501 21 Sep 15 olle 503     var bufferAl = '';
3501 21 Sep 15 olle 504     var bufferAW1 = '';
3501 21 Sep 15 olle 505     var bufferAW2 = '';
3501 21 Sep 15 olle 506     var bufferAte = '';
3501 21 Sep 15 olle 507     var qiaampMinEluteSpinColumn = '';
3501 21 Sep 15 olle 508
3501 21 Sep 15 olle 509     // Quality control reagents
3501 21 Sep 15 olle 510     var kapaSybrFast = '';
3501 21 Sep 15 olle 511     var qualityControlPrimersQcpRgt = '';
3501 21 Sep 15 olle 512     var qualityControlTemplateQct = '';
3501 21 Sep 15 olle 513     var qubitDnaHighSens = '';
3501 21 Sep 15 olle 514     var qubitDnaBroadRange = '';
3501 21 Sep 15 olle 515
3501 21 Sep 15 olle 516     // Find column separator as first character after first occurrence of search string
3501 21 Sep 15 olle 517     var separator = ExtractUtils.findSeparator(data, "Specimen Reagents");
3501 21 Sep 15 olle 518     if (separator == null)
3501 21 Sep 15 olle 519     {
3501 21 Sep 15 olle 520       // Comma is default separator
3501 21 Sep 15 olle 521       separator = ',';
3501 21 Sep 15 olle 522     }
3501 21 Sep 15 olle 523     var columnSplitRegexp = new RegExp(" *" + separator + " *",'');
3501 21 Sep 15 olle 524     var lines = data.split(/[\n\r]+/);
3501 21 Sep 15 olle 525     var columns = lines[0].split(columnSplitRegexp);
3501 21 Sep 15 olle 526
3501 21 Sep 15 olle 527     var numImported = 0;
3501 21 Sep 15 olle 528     var inQiaCubeSection = false;
3501 21 Sep 15 olle 529     for (var i = 1; i < lines.length; i++)
3501 21 Sep 15 olle 530     {
3501 21 Sep 15 olle 531       if (lines[i].match(/^\s*$/)) continue; // Ignore empty lines
3501 21 Sep 15 olle 532       var row = lines[i].split(columnSplitRegexp);
3501 21 Sep 15 olle 533       if (row[0] == 'Qiacube Reagents')
3501 21 Sep 15 olle 534       {
3501 21 Sep 15 olle 535         inQiaCubeSection = true;
3501 21 Sep 15 olle 536       }
3501 21 Sep 15 olle 537       if (row.length > 1) 
3501 21 Sep 15 olle 538       {
3501 21 Sep 15 olle 539         var key = row[0];
3501 21 Sep 15 olle 540         if (!key || key == '') continue; // with the next line
3501 21 Sep 15 olle 541
3501 21 Sep 15 olle 542         // FFPE DNA/RNA Kit  
3501 21 Sep 15 olle 543         if (key == 'AllPrep DNA/RNA FFPE kit')
3501 21 Sep 15 olle 544         {
3501 21 Sep 15 olle 545           allPrepFfpeKit = row[1];
3501 21 Sep 15 olle 546         }
3501 21 Sep 15 olle 547
3501 21 Sep 15 olle 548         // Specimen reagents
3501 21 Sep 15 olle 549         if (key == 'Xylen')
3501 21 Sep 15 olle 550         {
3501 21 Sep 15 olle 551           specXylene = row[1];
3501 21 Sep 15 olle 552         }
3501 21 Sep 15 olle 553         if (key == 'ETOH 99,5%')
3501 21 Sep 15 olle 554         {
3501 21 Sep 15 olle 555           if (!inQiaCubeSection)
3501 21 Sep 15 olle 556           {
3501 21 Sep 15 olle 557             specEtoh995 = row[1];
3501 21 Sep 15 olle 558           }
3501 21 Sep 15 olle 559         }
3501 21 Sep 15 olle 560         if (key == 'Buffer PKD')
3501 21 Sep 15 olle 561         {
3501 21 Sep 15 olle 562           specBufferPkd = row[1];
3501 21 Sep 15 olle 563         }
3501 21 Sep 15 olle 564         if (key == 'Buffer ATL')
3501 21 Sep 15 olle 565         {
3501 21 Sep 15 olle 566           specBufferAtl = row[1];
3501 21 Sep 15 olle 567         }
3501 21 Sep 15 olle 568         if (key == 'Proteinase K')
3501 21 Sep 15 olle 569         {
3501 21 Sep 15 olle 570           specProteinaseK = row[1];
3501 21 Sep 15 olle 571         }
3501 21 Sep 15 olle 572         if (key == 'Rnase A')
3501 21 Sep 15 olle 573         {
3501 21 Sep 15 olle 574           specRNAseA = row[1];
3501 21 Sep 15 olle 575         }
3501 21 Sep 15 olle 576
3501 21 Sep 15 olle 577         // QIAcube reagents
3501 21 Sep 15 olle 578         if (key == 'Buffer RLT')
3501 21 Sep 15 olle 579         {
3501 21 Sep 15 olle 580           bufferRlt = row[1];
3501 21 Sep 15 olle 581         }
3501 21 Sep 15 olle 582         if (key == 'ETOH 99,5%')
3501 21 Sep 15 olle 583         {
3501 21 Sep 15 olle 584           if (inQiaCubeSection)
3501 21 Sep 15 olle 585           {
3501 21 Sep 15 olle 586             etoh995 = row[1];
3501 21 Sep 15 olle 587           }
3501 21 Sep 15 olle 588         }
3501 21 Sep 15 olle 589         if (key == 'Buffer FRN')
3501 21 Sep 15 olle 590         {
3501 21 Sep 15 olle 591           bufferFrn = row[1];
3501 21 Sep 15 olle 592         }
3501 21 Sep 15 olle 593         if (key == 'Buffer RPE')
3501 21 Sep 15 olle 594         {
3501 21 Sep 15 olle 595           bufferRpe = row[1];
3501 21 Sep 15 olle 596         }
3501 21 Sep 15 olle 597         if (key == 'Rnase-free Water')
3501 21 Sep 15 olle 598         {
3501 21 Sep 15 olle 599           rnaseFreeWater = row[1];
3501 21 Sep 15 olle 600         }
3501 21 Sep 15 olle 601         if (key == 'DNAse mix')
3501 21 Sep 15 olle 602         {
3501 21 Sep 15 olle 603           dnaseMix = row[1];
3501 21 Sep 15 olle 604         }
3501 21 Sep 15 olle 605         if (key == 'RDD')
3501 21 Sep 15 olle 606         {
3501 21 Sep 15 olle 607           bufferRdd = row[1];
3501 21 Sep 15 olle 608         }
3501 21 Sep 15 olle 609         if (key == 'Rneasy MinElute Spin Column')
3501 21 Sep 15 olle 610         {
3501 21 Sep 15 olle 611           rneasyMinEluteSpinColumn = row[1];
3501 21 Sep 15 olle 612         }
3501 21 Sep 15 olle 613         if (key == 'Buffer AL')
3501 21 Sep 15 olle 614         {
3501 21 Sep 15 olle 615           bufferAl = row[1];
3501 21 Sep 15 olle 616         }
3501 21 Sep 15 olle 617         if (key == 'Buffer AW1')
3501 21 Sep 15 olle 618         {
3501 21 Sep 15 olle 619           bufferAW1 = row[1];
3501 21 Sep 15 olle 620         }
3501 21 Sep 15 olle 621         if (key == 'Buffer AW2')
3501 21 Sep 15 olle 622         {
3501 21 Sep 15 olle 623           bufferAW2 = row[1];
3501 21 Sep 15 olle 624         }
3501 21 Sep 15 olle 625         if (key == 'Buffer ATE')
3501 21 Sep 15 olle 626         {
3501 21 Sep 15 olle 627           bufferAte = row[1];
3501 21 Sep 15 olle 628         }
3501 21 Sep 15 olle 629         if (key == 'QIAamp MinElute Spin Column')
3501 21 Sep 15 olle 630         {
3501 21 Sep 15 olle 631           qiaampMinEluteSpinColumn = row[1];
3501 21 Sep 15 olle 632         }
3501 21 Sep 15 olle 633
3501 21 Sep 15 olle 634         // Quality control reagents
3501 21 Sep 15 olle 635         if (key == 'Kapa SYBR Fast')
3501 21 Sep 15 olle 636         {
3501 21 Sep 15 olle 637           kapaSybrFast = row[1];
3501 21 Sep 15 olle 638         }
3501 21 Sep 15 olle 639         if (key == 'Quality Control Primers (QCP) RGT')
3501 21 Sep 15 olle 640         {
3501 21 Sep 15 olle 641           qualityControlPrimersQcpRgt = row[1];
3501 21 Sep 15 olle 642         }
3501 21 Sep 15 olle 643         if (key == 'Quality Control Template (QCT)')
3501 21 Sep 15 olle 644         {
3501 21 Sep 15 olle 645           qualityControlTemplateQct = row[1];
3501 21 Sep 15 olle 646         }
3501 21 Sep 15 olle 647         if (key == 'QUBIT DNA High Sens')
3501 21 Sep 15 olle 648         {
3501 21 Sep 15 olle 649           qubitDnaHighSens = row[1];
3501 21 Sep 15 olle 650         }
3501 21 Sep 15 olle 651         if (key == 'QUBIT DNA Broad Range')
3501 21 Sep 15 olle 652         {
3501 21 Sep 15 olle 653           qubitDnaBroadRange = row[1];
3501 21 Sep 15 olle 654         }
3501 21 Sep 15 olle 655       }
3501 21 Sep 15 olle 656     }
3501 21 Sep 15 olle 657
3501 21 Sep 15 olle 658     // Update reagent values
3501 21 Sep 15 olle 659
3501 21 Sep 15 olle 660     // Specimen reagents
3501 21 Sep 15 olle 661     frm.xyleneSpecimen.value = specXylene;
3501 21 Sep 15 olle 662     frm.etoh995Specimen.value = specEtoh995;
3501 21 Sep 15 olle 663     frm.bufferPkdSpecimen.value = specBufferPkd;
3501 21 Sep 15 olle 664     frm.bufferAtlSpecimen.value = specBufferAtl;
3501 21 Sep 15 olle 665     frm.proteinaseKSpecimen.value = specProteinaseK;
3501 21 Sep 15 olle 666     frm.rnaseASpecimen.value = specRNAseA;
3501 21 Sep 15 olle 667
3501 21 Sep 15 olle 668     // QIAcube reagents
3501 21 Sep 15 olle 669     if (frm.allPrepFfpeKit.value == null || frm.allPrepFfpeKit.value == '')
3501 21 Sep 15 olle 670     {
3501 21 Sep 15 olle 671       frm.allPrepFfpeKit.value = allPrepFfpeKit;
3501 21 Sep 15 olle 672     }
3501 21 Sep 15 olle 673     frm.etoh995.value = etoh995;
3501 21 Sep 15 olle 674     frm.bufferRlt.value = bufferRlt;
3501 21 Sep 15 olle 675     frm.bufferFrn.value = bufferFrn;
3501 21 Sep 15 olle 676     frm.bufferRpe.value = bufferRpe;
3501 21 Sep 15 olle 677     frm.bufferAl.value = bufferAl;
3501 21 Sep 15 olle 678     frm.bufferAw1.value = bufferAW1;
3501 21 Sep 15 olle 679     frm.bufferAw2.value = bufferAW2;
3501 21 Sep 15 olle 680     frm.bufferAte.value = bufferAte;
3501 21 Sep 15 olle 681     frm.bufferRdd.value = bufferRdd;
3501 21 Sep 15 olle 682     frm.rnaseFreeWater.value = rnaseFreeWater;
3501 21 Sep 15 olle 683     frm.dnaseMix.value = dnaseMix;
3501 21 Sep 15 olle 684     frm.rneasyMinEluteSpinColumn.value = rneasyMinEluteSpinColumn;
3501 21 Sep 15 olle 685     frm.qiaampMinEluteSpinColumn.value = qiaampMinEluteSpinColumn;
3501 21 Sep 15 olle 686
3501 21 Sep 15 olle 687     // Quality control reagents
3501 21 Sep 15 olle 688     frm.kapaSybrFast.value = kapaSybrFast;
3501 21 Sep 15 olle 689     frm.qualityControlPrimersQcpRgt.value = qualityControlPrimersQcpRgt;
3501 21 Sep 15 olle 690     frm.qualityControlTemplateQct.value = qualityControlTemplateQct;
3501 21 Sep 15 olle 691     frm.qubitDnaHighSens.value = qubitDnaHighSens;
3501 21 Sep 15 olle 692     frm.qubitDnaBroadRange.value = qubitDnaBroadRange;
3501 21 Sep 15 olle 693
3501 21 Sep 15 olle 694     if (numImported != numReagentItems)
3501 21 Sep 15 olle 695     {
3501 21 Sep 15 olle 696       Wizard.setInputStatus('reagentFile', 'invalid', 'Could not find values for all ' + numReagentItems + ' samples: ' + numImported);
3501 21 Sep 15 olle 697       return;
3501 21 Sep 15 olle 698     }
3501 21 Sep 15 olle 699
3501 21 Sep 15 olle 700     Wizard.setInputStatus('reagentFile', 'valid');
3501 21 Sep 15 olle 701     reagentFileIsValid = true;
3501 21 Sep 15 olle 702   }
3501 21 Sep 15 olle 703
3501 21 Sep 15 olle 704   exprep.findReagentColumn = function(columns, col)
3501 21 Sep 15 olle 705   {
3501 21 Sep 15 olle 706     var colIndex = columns.indexOf(col);
3501 21 Sep 15 olle 707     if (colIndex == -1)
3501 21 Sep 15 olle 708     {
3501 21 Sep 15 olle 709       Wizard.setInputStatus('reagentFile', 'invalid', 'On line 1; Can\'t find "' + col + '" column');
3501 21 Sep 15 olle 710     }
3501 21 Sep 15 olle 711     return colIndex;
3501 21 Sep 15 olle 712   }
3176 06 Mar 15 olle 713   
3501 21 Sep 15 olle 714   exprep.downloadReagentLotNoFile = function()
3501 21 Sep 15 olle 715   {
3501 21 Sep 15 olle 716     var frm = document.forms['meludi'];
3501 21 Sep 15 olle 717     
3501 21 Sep 15 olle 718     var reagentInfo = {};
3501 21 Sep 15 olle 719     var url = '../Extraction.servlet?ID='+App.getSessionId();
3501 21 Sep 15 olle 720     url += '&cmd=DownloadReagentLotNoFile';
3501 21 Sep 15 olle 721     url += '&startListName='+encodeURIComponent(frm.startListName.value);
3501 21 Sep 15 olle 722     url += '&isolationDate='+encodeURIComponent(frm.isolationDate.value);
3501 21 Sep 15 olle 723     
3501 21 Sep 15 olle 724     // Reagents
3501 21 Sep 15 olle 725     for (var i = 0; i < exprep.REAGENTS.length; i++)
3501 21 Sep 15 olle 726     {
3501 21 Sep 15 olle 727       var rg = exprep.REAGENTS[i];
3501 21 Sep 15 olle 728       reagentInfo[rg] = frm[rg].value;
3501 21 Sep 15 olle 729     }
3501 21 Sep 15 olle 730
3501 21 Sep 15 olle 731     url += '&reagentInfo=' + encodeURIComponent(JSON.stringify(reagentInfo));
3501 21 Sep 15 olle 732     window.open(url);
3501 21 Sep 15 olle 733   }
3501 21 Sep 15 olle 734   
3176 06 Mar 15 olle 735   exprep.validateStep2 = function(event)
3176 06 Mar 15 olle 736   {
3176 06 Mar 15 olle 737     var valid = true;
3180 17 Mar 15 olle 738     valid &= Wizard.isValid('isolationDate');
3176 06 Mar 15 olle 739     valid &= Wizard.isValid('qiacubeDate');
3176 06 Mar 15 olle 740     valid &= qiacubeRunNoIsValid;
3176 06 Mar 15 olle 741     
3176 06 Mar 15 olle 742     if (!valid) event.preventDefault();
3176 06 Mar 15 olle 743   }
3176 06 Mar 15 olle 744
3176 06 Mar 15 olle 745   
3176 06 Mar 15 olle 746   exprep.initializeStep3 = function()
3176 06 Mar 15 olle 747   {
3176 06 Mar 15 olle 748     var frm = document.forms['meludi'];
3432 29 Jun 15 olle 749     var startListName = frm.startListName.value;
3432 29 Jun 15 olle 750     Doc.element('detailsStartListName').innerHTML = '<b>Start list: ' + startListName + '</b>';
3180 17 Mar 15 olle 751 /*
3352 26 May 15 olle 752     var rnaDefaultVolume = ExtractUtils.getNumber(frm.rnaDefaultVolume.value);
3352 26 May 15 olle 753     var dnaDefaultVolume = ExtractUtils.getNumber(frm.dnaDefaultVolume.value);
3180 17 Mar 15 olle 754 */
3176 06 Mar 15 olle 755     qiacubeSortedPrefixes = exprep.getQiacubeSortedPrefixes();
3176 06 Mar 15 olle 756     
3176 06 Mar 15 olle 757     var html = '<table id="detailsTable" class="step-form">';
3176 06 Mar 15 olle 758     // First header row
3176 06 Mar 15 olle 759     html += '<thead>';
3176 06 Mar 15 olle 760     html += '<tr>';
3220 01 Apr 15 olle 761     html += '<th>Extract</th>';
3176 06 Mar 15 olle 762     html += '<th class="dottedleft">QIAcube</th>';
3176 06 Mar 15 olle 763     html += '<th colspan="1" class="dottedleft"></th>';
3238 10 Apr 15 olle 764     html += '<th colspan="1" class="dottedleft">NanoDrop</th>';
3177 09 Mar 15 olle 765 /*
3176 06 Mar 15 olle 766     html += '<th colspan="5" class="dottedleft">RNA</th>';
3177 09 Mar 15 olle 767 */
3180 17 Mar 15 olle 768 /*
3177 09 Mar 15 olle 769     html += '<th colspan="3" class="dottedleft">RNA</th>';
3176 06 Mar 15 olle 770     html += '<th colspan="4" class="dottedleft">DNA</th>';
3180 17 Mar 15 olle 771 */
3276 29 Apr 15 olle 772     html += '<th colspan="1" class="dottedleft">RNA</th>';
3276 29 Apr 15 olle 773     html += '<th colspan="1" class="dottedleft">DNA</th>';
3176 06 Mar 15 olle 774     html += '<th class="dottedleft comment">Comment</th>';
3176 06 Mar 15 olle 775     html += '</tr>';
3176 06 Mar 15 olle 776     // Second header row
3176 06 Mar 15 olle 777     html += '<tr>';
3220 01 Apr 15 olle 778     html += '<th>source item</th>';
3176 06 Mar 15 olle 779     html += '<th class="dottedleft">position</th>';
3176 06 Mar 15 olle 780     html += '<td class="dottedleft">Storage</td>';
3176 06 Mar 15 olle 781 /*
3176 06 Mar 15 olle 782     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>';
3176 06 Mar 15 olle 783 */
3177 09 Mar 15 olle 784 /*
3176 06 Mar 15 olle 785     html += '<td class="dottedleft">Pos</td><td>Vol.</td><td>Conc.</td><td>Quantity</td><td>Pre-</td>';
3177 09 Mar 15 olle 786 */
3180 17 Mar 15 olle 787 /*
3177 09 Mar 15 olle 788     html += '<td class="dottedleft">Pos</td><td>Vol.</td><td>Conc.</td><td>Quantity</td>';
3176 06 Mar 15 olle 789     html += '<td class="dottedleft">Vol.</td><td>Conc.</td><td>Quantity</td><td>ΔCt</td>';
3180 17 Mar 15 olle 790 */
5852 06 Mar 20 olle 791     html += '<th class="dottedleft">Box Pos.</th>';
5852 06 Mar 20 olle 792     html += '<th class="dottedleft">Box Pos.</th>';
5852 06 Mar 20 olle 793     html += '<th class="dottedleft">Box Pos.</th>';
3176 06 Mar 15 olle 794     html += '<td class="dottedleft comment"></td>';
3176 06 Mar 15 olle 795     html += '</tr>';
3176 06 Mar 15 olle 796     // Third header row
3176 06 Mar 15 olle 797     html += '<tr>';
3176 06 Mar 15 olle 798     html += '<th></th>';
3176 06 Mar 15 olle 799     html += '<th class="dottedleft"></th>';
3176 06 Mar 15 olle 800     html += '<td class="dottedleft">box</td>';
3176 06 Mar 15 olle 801 /*
3176 06 Mar 15 olle 802     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>';
3176 06 Mar 15 olle 803 */
3177 09 Mar 15 olle 804 /*
3176 06 Mar 15 olle 805     html += '<td class="dottedleft"></td><td>(µl)</td><td>(ng/µl)</td><td>(µg)</td><td>normalize</td>';
3177 09 Mar 15 olle 806 */
3180 17 Mar 15 olle 807 /*
3177 09 Mar 15 olle 808     html += '<td class="dottedleft"></td><td>(µl)</td><td>(ng/µl)</td><td>(µg)</td>';
3176 06 Mar 15 olle 809     html += '<td class="dottedleft">(µl)</td><td>(ng/µl)</td><td>(µg)</td><td></td>';
3180 17 Mar 15 olle 810 */
3180 17 Mar 15 olle 811     html += '<td class="dottedleft"></td>';
3276 29 Apr 15 olle 812     html += '<td class="dottedleft"></td>';
3276 29 Apr 15 olle 813     html += '<td class="dottedleft"></td>';
3176 06 Mar 15 olle 814     html += '<td class="dottedleft comment"></td>';
3176 06 Mar 15 olle 815     html += '</tr>';
3176 06 Mar 15 olle 816     html += '</thead>';
3176 06 Mar 15 olle 817     html += '<tbody>';
3176 06 Mar 15 olle 818
3176 06 Mar 15 olle 819     // Get list of selected extract source items
3176 06 Mar 15 olle 820     var selItemsList = exprep.getSelectedItemsList();
3176 06 Mar 15 olle 821     var numItems = selItemsList.length;
3176 06 Mar 15 olle 822     var numSpecimenItems = exprep.getNumberOfSpecimenItems();
3176 06 Mar 15 olle 823     var numRnaItems = exprep.getNumberOfRnaItems();
3176 06 Mar 15 olle 824     var numDnaItems = exprep.getNumberOfDnaItems();
3176 06 Mar 15 olle 825     var numNanoDropItems = numSpecimenItems + numRnaItems;
3413 23 Jun 15 olle 826     var numQiacubeItems = numSpecimenItems;
3413 23 Jun 15 olle 827     var totNumItems = numItems;
3176 06 Mar 15 olle 828     var itemNo = 0;
3180 17 Mar 15 olle 829     var qiacubeItemNo = 0;
3176 06 Mar 15 olle 830     // Set default values for DNA/RNA extraction
3180 17 Mar 15 olle 831     for (var i = 0; i < totNumItems; i++)
3176 06 Mar 15 olle 832     {
3176 06 Mar 15 olle 833       itemNo++;
3180 17 Mar 15 olle 834       var item = null;
3180 17 Mar 15 olle 835       var storageBox = '-';
3276 29 Apr 15 olle 836       var rnaStorageBox = '-';
3276 29 Apr 15 olle 837       var dnaStorageBox = '-';
3180 17 Mar 15 olle 838       if (i < numItems)
3176 06 Mar 15 olle 839       {
3180 17 Mar 15 olle 840         item = selItemsList[i];
3180 17 Mar 15 olle 841         var qiacubePos = null;
3352 26 May 15 olle 842         if (ExtractUtils.isSpecimen(item))
3180 17 Mar 15 olle 843         {
3180 17 Mar 15 olle 844           qiacubeItemNo++;
3354 27 May 15 olle 845           qiacubePos = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems, qiacubeItemNo, qiacubeSortedPrefixes);
3180 17 Mar 15 olle 846         }
3180 17 Mar 15 olle 847         item.qiacubePosition = qiacubePos;
3180 17 Mar 15 olle 848         item.originalQiacubePosition = qiacubePos;
3176 06 Mar 15 olle 849         
3180 17 Mar 15 olle 850         var rna = {};
3180 17 Mar 15 olle 851         var dna = {};
3180 17 Mar 15 olle 852         // RNA
3180 17 Mar 15 olle 853         rna.name = item.name + '.r';
3180 17 Mar 15 olle 854 /*
3180 17 Mar 15 olle 855         rna.volume = rnaDefaultVolume;
3180 17 Mar 15 olle 856 */
3180 17 Mar 15 olle 857         // DNA
3180 17 Mar 15 olle 858         dna.name = item.name + '.d';
3180 17 Mar 15 olle 859 /*
3180 17 Mar 15 olle 860         dna.volume = dnaDefaultVolume;
3180 17 Mar 15 olle 861 */
3276 29 Apr 15 olle 862 /*        
3180 17 Mar 15 olle 863         item.rna = rna;
3180 17 Mar 15 olle 864         item.dna = dna;
3276 29 Apr 15 olle 865 */
3276 29 Apr 15 olle 866         if (!item.rna)
3276 29 Apr 15 olle 867         {
3276 29 Apr 15 olle 868           item.rna = rna;
3276 29 Apr 15 olle 869         }
3276 29 Apr 15 olle 870         if (!item.dna)
3276 29 Apr 15 olle 871         {
3276 29 Apr 15 olle 872           item.dna = dna;
3276 29 Apr 15 olle 873         }
3180 17 Mar 15 olle 874 /*
3180 17 Mar 15 olle 875         var storageBox = '-';
3180 17 Mar 15 olle 876 */
3293 30 Apr 15 olle 877         // Input extract source item specimen/RNA/DNA
3180 17 Mar 15 olle 878         if (item.bioWell != null)
3180 17 Mar 15 olle 879         {
3180 17 Mar 15 olle 880           storageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3180 17 Mar 15 olle 881         }
3293 30 Apr 15 olle 882         // RNA extract from specimen
3276 29 Apr 15 olle 883         if (item.rna && item.rna.bioWell)
3276 29 Apr 15 olle 884         {
3276 29 Apr 15 olle 885           rnaStorageBox = Strings.encodeTags(item.rna.bioWell.bioPlate.name + '[' + item.rna.bioWell.location + ']');
3276 29 Apr 15 olle 886         }
3293 30 Apr 15 olle 887         // DNA extract from specimen
3276 29 Apr 15 olle 888         if (item.dna && item.dna.bioWell)
3276 29 Apr 15 olle 889         {
3276 29 Apr 15 olle 890           dnaStorageBox = Strings.encodeTags(item.dna.bioWell.bioPlate.name + '[' + item.dna.bioWell.location + ']');
3276 29 Apr 15 olle 891         }
3293 30 Apr 15 olle 892         // Input RNA item storage location should be displayed in the RNA extract storage location column
3352 26 May 15 olle 893         if (ExtractUtils.isRna(item) && item.bioWell != null)
3293 30 Apr 15 olle 894         {
3293 30 Apr 15 olle 895           rnaStorageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3293 30 Apr 15 olle 896         }
3293 30 Apr 15 olle 897         // Input DNA item storage location should be displayed in the DNA extract storage location column
3352 26 May 15 olle 898         if (ExtractUtils.isDna(item) && item.bioWell != null)
3293 30 Apr 15 olle 899         {
3293 30 Apr 15 olle 900           dnaStorageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3293 30 Apr 15 olle 901         }
3180 17 Mar 15 olle 902       }
3176 06 Mar 15 olle 903         
3176 06 Mar 15 olle 904       html += '<tr class="highlight">';
3245 14 Apr 15 olle 905       if (i < numItems)
3245 14 Apr 15 olle 906       {
3245 14 Apr 15 olle 907         html += '<th>' + Strings.encodeTags(item.name) + '</th>';
3245 14 Apr 15 olle 908       }
3245 14 Apr 15 olle 909       else
3245 14 Apr 15 olle 910       {
3245 14 Apr 15 olle 911         // Extra QIAcube item
3245 14 Apr 15 olle 912         html += '<th><input type="text" id="itemName'+i+'" style="font-weight:bold;" value="' + Strings.encodeTags(item.name) + '"></intput></th>';
3245 14 Apr 15 olle 913       }
3176 06 Mar 15 olle 914       html += '<td id="qiacubePosition'+i+'" class="dottedleft"></td>';
3176 06 Mar 15 olle 915       html += '<td class="dottedleft">'+storageBox+'</td>';
3176 06 Mar 15 olle 916       html += '<td id="rnaPos'+i+'" class="dottedleft"></td>';
3180 17 Mar 15 olle 917 /*
3176 06 Mar 15 olle 918       html += '<td id="rnaVol'+i+'"></td>';
3176 06 Mar 15 olle 919       html += '<td id="rnaConc'+i+'" class="bg-filled-50 italic"></td>';
3176 06 Mar 15 olle 920       html += '<td id="rnaQuantity'+i+'" class="bg-filled-50 italic"></td>';
3180 17 Mar 15 olle 921 */
3177 09 Mar 15 olle 922 /*
3176 06 Mar 15 olle 923       html += '<td id="rnaPreNormalize'+i+'"name="rnaPreNormalize'+i+'"></td>';
3177 09 Mar 15 olle 924 */
3180 17 Mar 15 olle 925 /*
3176 06 Mar 15 olle 926       html += '<td id="dnaVol'+i+'"></td>';
3176 06 Mar 15 olle 927       html += '<td id="dnaConc'+i+'">-</td>';
3176 06 Mar 15 olle 928       html += '<td id="dnaQuantity'+i+'" class="bg-filled-50 italic"></td>';
3176 06 Mar 15 olle 929       html += '<td id="deltaCt'+i+'" class="bg-filled-50 italic">-</td>';
3180 17 Mar 15 olle 930 */
3276 29 Apr 15 olle 931       html += '<td id="rnaPlatePos'+i+'" class="dottedleft">'+rnaStorageBox+'</td>';
3276 29 Apr 15 olle 932       html += '<td id="dnaPlatePos'+i+'" class="dottedleft">'+dnaStorageBox+'</td>';
3176 06 Mar 15 olle 933       html += '<td id="comments'+i+'" class="dottedleft comment"></td>';
3176 06 Mar 15 olle 934       html += '</tr>';
3176 06 Mar 15 olle 935     }
3180 17 Mar 15 olle 936     if (numQiacubeItems == 1 || numQiacubeItems == 11 || numQiacubeItems == 23)
3176 06 Mar 15 olle 937     {
3176 06 Mar 15 olle 938       // Add extra row for counterbalance in QIAcube
3176 06 Mar 15 olle 939       counterBalanceInfoRow = true;
3176 06 Mar 15 olle 940       var i = numItems;
3354 27 May 15 olle 941       var qiacubePos = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems + 1, numQiacubeItems + 1, qiacubeSortedPrefixes);
3176 06 Mar 15 olle 942         
3176 06 Mar 15 olle 943       html += '<tr class="highlight">';
3276 29 Apr 15 olle 944       html += '<th>' + Strings.encodeTags('COUNTER-BALANCE') + '</th>';
3176 06 Mar 15 olle 945       html += '<td id="qiacubePosition'+i+'" class="dottedleft">'+qiacubePos+'</td>';
3176 06 Mar 15 olle 946       html += '<td class="dottedleft">-</td>';
3176 06 Mar 15 olle 947       html += '<td id="rnaPos'+i+'" class="dottedleft">-</td>';
3180 17 Mar 15 olle 948 /*
3176 06 Mar 15 olle 949       html += '<td id="rnaVol'+i+'">-</td>';
3176 06 Mar 15 olle 950       html += '<td id="rnaConc'+i+'" class="bg-filled-50 italic">-</td>';
3176 06 Mar 15 olle 951       html += '<td id="rnaQuantity'+i+'" class="bg-filled-50 italic">-</td>';
3180 17 Mar 15 olle 952 */
3177 09 Mar 15 olle 953 /*
3176 06 Mar 15 olle 954       html += '<td>-</td>';
3177 09 Mar 15 olle 955 */
3180 17 Mar 15 olle 956 /*
3176 06 Mar 15 olle 957       html += '<td id="dnaVol'+i+'">-</td>';
3176 06 Mar 15 olle 958       html += '<td id="dnaConc'+i+'">-</td>';
3176 06 Mar 15 olle 959       html += '<td id="dnaQuantity'+i+'" class="bg-filled-50 italic">-</td>';
3176 06 Mar 15 olle 960       html += '<td id="deltaCt'+i+'" class="bg-filled-50 italic">-</td>';
3180 17 Mar 15 olle 961 */
3276 29 Apr 15 olle 962       html += '<td id="rnaPlatePos'+i+'" class="dottedleft">-</td>';
3276 29 Apr 15 olle 963       html += '<td id="dnaPlatePos'+i+'" class="dottedleft">-</td>';
3176 06 Mar 15 olle 964       html += '<td id="comments'+i+'" class="dottedleft comment">Reminder to use counterbalance</td>';
3176 06 Mar 15 olle 965       html += '</tr>';        
3176 06 Mar 15 olle 966     }
3176 06 Mar 15 olle 967     html += '</tbody>';
3176 06 Mar 15 olle 968     html += '</table>';
3176 06 Mar 15 olle 969     Doc.element('detailsSection').innerHTML = html;
3245 14 Apr 15 olle 970
3245 14 Apr 15 olle 971     for (var i = numItems; i < totNumItems; i++)
3245 14 Apr 15 olle 972     {
3245 14 Apr 15 olle 973       Events.addEventHandler('itemName'+i, 'change', exprep.itemNameOnChange);
3245 14 Apr 15 olle 974     }
3176 06 Mar 15 olle 975
3176 06 Mar 15 olle 976     exprep.updateDetailsTable();
3176 06 Mar 15 olle 977     
3176 06 Mar 15 olle 978     Wizard.setCurrentStep(3);
3176 06 Mar 15 olle 979     Doc.show('gocancel');
3180 17 Mar 15 olle 980     Doc.show('goregister');
3176 06 Mar 15 olle 981     Doc.show('gocreate');
3180 17 Mar 15 olle 982     //Doc.hide('gocreate');
5858 10 Mar 20 olle 983     Doc.show('downloaddnarnalabelfile');
3176 06 Mar 15 olle 984
3176 06 Mar 15 olle 985     Wizard.keepSessionAlive();
3176 06 Mar 15 olle 986     
3176 06 Mar 15 olle 987     if (debug && location.protocol != 'https:') 
3176 06 Mar 15 olle 988     {
3176 06 Mar 15 olle 989       Wizard.showDebugTools();
3176 06 Mar 15 olle 990     }
3176 06 Mar 15 olle 991   }
3176 06 Mar 15 olle 992
3176 06 Mar 15 olle 993   exprep.getQiacubeSortedPrefixes = function()
3176 06 Mar 15 olle 994   {
3176 06 Mar 15 olle 995     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 996     var primaryQiacubePrefix = frm.qiacubePrimaryPrefix.value;
3176 06 Mar 15 olle 997     var secondaryQiacubePrefix = frm.qiacubeSecondaryPrefix.value;
3176 06 Mar 15 olle 998
3176 06 Mar 15 olle 999     // Get string of current QIAcube prefixes in order
3354 27 May 15 olle 1000     var sortedPrefixes = ExtractUtils.getQiacubeSortedPrefixes(primaryQiacubePrefix, secondaryQiacubePrefix);
3176 06 Mar 15 olle 1001     return sortedPrefixes;
3176 06 Mar 15 olle 1002   }
3176 06 Mar 15 olle 1003
3176 06 Mar 15 olle 1004   exprep.getSelectedItemsList = function()
3176 06 Mar 15 olle 1005   {
3176 06 Mar 15 olle 1006     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 1007     
3176 06 Mar 15 olle 1008     // Get number of selected extract source items
3176 06 Mar 15 olle 1009     var numItems = 0;
3176 06 Mar 15 olle 1010     var selItemsList = [];
3176 06 Mar 15 olle 1011     for (var i = 0; i < frm.extractSourceItems.length; i++)
3176 06 Mar 15 olle 1012     {
3176 06 Mar 15 olle 1013       if (frm.extractSourceItems[i].selected)
3176 06 Mar 15 olle 1014       {
3212 27 Mar 15 olle 1015         if (frm.extractSourceItems[i].item != null)
3176 06 Mar 15 olle 1016         {
3212 27 Mar 15 olle 1017           selItemsList[numItems] = frm.extractSourceItems[i].item;
3176 06 Mar 15 olle 1018           numItems++;
3176 06 Mar 15 olle 1019         }
3176 06 Mar 15 olle 1020       }
3176 06 Mar 15 olle 1021     }
3176 06 Mar 15 olle 1022     return selItemsList;
3176 06 Mar 15 olle 1023   }
3176 06 Mar 15 olle 1024
3176 06 Mar 15 olle 1025   exprep.getNumberOfSpecimenItems = function()
3176 06 Mar 15 olle 1026   {
3176 06 Mar 15 olle 1027     // Get list of selected extract source items
3176 06 Mar 15 olle 1028     var selItemsList = exprep.getSelectedItemsList();
3176 06 Mar 15 olle 1029     var numItems = selItemsList.length;
3176 06 Mar 15 olle 1030     var numSpecimen = 0;
3176 06 Mar 15 olle 1031     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 1032     {
3176 06 Mar 15 olle 1033       var item = selItemsList[i];
3352 26 May 15 olle 1034       if (ExtractUtils.isSpecimen(item))
3176 06 Mar 15 olle 1035       {
3176 06 Mar 15 olle 1036         numSpecimen++;
3176 06 Mar 15 olle 1037       }
3176 06 Mar 15 olle 1038     }
3176 06 Mar 15 olle 1039     return numSpecimen;
3176 06 Mar 15 olle 1040   }
3176 06 Mar 15 olle 1041   
3176 06 Mar 15 olle 1042   exprep.getNumberOfRnaItems = function()
3176 06 Mar 15 olle 1043   {
3176 06 Mar 15 olle 1044     // Get list of selected extract source items
3176 06 Mar 15 olle 1045     var selItemsList = exprep.getSelectedItemsList();
3176 06 Mar 15 olle 1046     var numItems = selItemsList.length;
3176 06 Mar 15 olle 1047     var numRna = 0;
3176 06 Mar 15 olle 1048     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 1049     {
3176 06 Mar 15 olle 1050       var item = selItemsList[i];
3352 26 May 15 olle 1051       if (ExtractUtils.isRna(item))
3176 06 Mar 15 olle 1052       {
3176 06 Mar 15 olle 1053         numRna++;
3176 06 Mar 15 olle 1054       }
3176 06 Mar 15 olle 1055     }
3176 06 Mar 15 olle 1056     return numRna;
3176 06 Mar 15 olle 1057   }
3176 06 Mar 15 olle 1058   
3176 06 Mar 15 olle 1059   exprep.getNumberOfDnaItems = function()
3176 06 Mar 15 olle 1060   {
3176 06 Mar 15 olle 1061     // Get list of selected extract source items
3176 06 Mar 15 olle 1062     var selItemsList = exprep.getSelectedItemsList();
3176 06 Mar 15 olle 1063     var numItems = selItemsList.length;
3176 06 Mar 15 olle 1064     var numDna = 0;
3176 06 Mar 15 olle 1065     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 1066     {
3176 06 Mar 15 olle 1067       var item = selItemsList[i];
3352 26 May 15 olle 1068       if (ExtractUtils.isDna(item))
3176 06 Mar 15 olle 1069       {
3176 06 Mar 15 olle 1070         numDna++;
3176 06 Mar 15 olle 1071       }
3176 06 Mar 15 olle 1072     }
3176 06 Mar 15 olle 1073     return numDna;
3176 06 Mar 15 olle 1074   }
3176 06 Mar 15 olle 1075
3176 06 Mar 15 olle 1076   exprep.updateDetailsTable = function()
3176 06 Mar 15 olle 1077   {
3176 06 Mar 15 olle 1078     var frm = document.forms['meludi'];
3180 17 Mar 15 olle 1079 /*
3352 26 May 15 olle 1080     var rnaDefaultVolume = ExtractUtils.getNumber(frm.rnaDefaultVolume.value);
3352 26 May 15 olle 1081     var dnaDefaultVolume = ExtractUtils.getNumber(frm.dnaDefaultVolume.value);
3180 17 Mar 15 olle 1082 */
3176 06 Mar 15 olle 1083     var hasQiacubePosition = [];
3176 06 Mar 15 olle 1084     var duplicatePosition = 0;
3176 06 Mar 15 olle 1085
3354 27 May 15 olle 1086     qiacubeSortedPrefixes = exprep.getQiacubeSortedPrefixes();
3176 06 Mar 15 olle 1087     // Get list of selected extract source items
3176 06 Mar 15 olle 1088     var selItemsList = exprep.getSelectedItemsList();
3176 06 Mar 15 olle 1089     var numItems = selItemsList.length;
3413 23 Jun 15 olle 1090     var totNumItems = numItems;
3176 06 Mar 15 olle 1091     // Get sorted list of used integer QIAcube positions for specimens, generalized for more than one QIAcube
3176 06 Mar 15 olle 1092     var specSortedIntQiacubePosition = [];
3180 17 Mar 15 olle 1093     var qiacubeItemNo = 0;
3180 17 Mar 15 olle 1094     for (var i = 0; i < totNumItems; i++)
3176 06 Mar 15 olle 1095     {
3180 17 Mar 15 olle 1096       if (i < numItems)
3176 06 Mar 15 olle 1097       {
3180 17 Mar 15 olle 1098         var item = selItemsList[i];
3352 26 May 15 olle 1099         if (ExtractUtils.isSpecimen(item))
3180 17 Mar 15 olle 1100         {
3354 27 May 15 olle 1101           var intQiacubePosition = ExtractUtils.getIntQiacubePosition(item.qiacubePosition, qiacubeSortedPrefixes);
3180 17 Mar 15 olle 1102           specSortedIntQiacubePosition[qiacubeItemNo] = intQiacubePosition;
3180 17 Mar 15 olle 1103           qiacubeItemNo++;
3180 17 Mar 15 olle 1104         }
3180 17 Mar 15 olle 1105       }
3176 06 Mar 15 olle 1106     }
3176 06 Mar 15 olle 1107     // Sort for ascending integer values
3176 06 Mar 15 olle 1108     specSortedIntQiacubePosition.sort(function(a,b){return a-b});
3176 06 Mar 15 olle 1109     var numSpecimenItems = exprep.getNumberOfSpecimenItems();
3176 06 Mar 15 olle 1110     var numRnaItems = exprep.getNumberOfRnaItems();
3176 06 Mar 15 olle 1111     var numDnaItems = exprep.getNumberOfDnaItems();
3176 06 Mar 15 olle 1112     var numNanoDropItems = numSpecimenItems + numRnaItems;
3176 06 Mar 15 olle 1113     var rnaItemNo = 0;
3176 06 Mar 15 olle 1114     // Set default values for DNA/RNA extraction
3180 17 Mar 15 olle 1115     for (var i = 0; i < totNumItems; i++)
3176 06 Mar 15 olle 1116     {
3180 17 Mar 15 olle 1117       var item = null;
3180 17 Mar 15 olle 1118       if (i < numItems)
3180 17 Mar 15 olle 1119       {
3180 17 Mar 15 olle 1120         item = selItemsList[i];
3180 17 Mar 15 olle 1121       }
3176 06 Mar 15 olle 1122       Doc.element('qiacubePosition'+i).innerHTML = item.qiacubePosition;
3176 06 Mar 15 olle 1123       Doc.addOrRemoveClass('qiacubePosition'+i, 'nondefault', item.qiacubePosition != item.originalQiacubePosition);
3176 06 Mar 15 olle 1124
3354 27 May 15 olle 1125       var intQiacubePosition = ExtractUtils.getIntQiacubePosition(item.qiacubePosition, qiacubeSortedPrefixes);
3176 06 Mar 15 olle 1126       if (intQiacubePosition != null)
3176 06 Mar 15 olle 1127       {
3176 06 Mar 15 olle 1128         if (hasQiacubePosition[intQiacubePosition])
3176 06 Mar 15 olle 1129         {
3176 06 Mar 15 olle 1130           duplicatePosition = intQiacubePosition;
3176 06 Mar 15 olle 1131         }
3176 06 Mar 15 olle 1132         else
3176 06 Mar 15 olle 1133         {
3176 06 Mar 15 olle 1134           hasQiacubePosition[intQiacubePosition] = true;
3176 06 Mar 15 olle 1135         }
3176 06 Mar 15 olle 1136       }
3176 06 Mar 15 olle 1137       var intNanoDropPlatePosition = intQiacubePosition;
3176 06 Mar 15 olle 1138       // Get integer NanoDrop position for specimens from index in sorted list of used integer QIAcube positions
3176 06 Mar 15 olle 1139       if (intQiacubePosition)
3176 06 Mar 15 olle 1140       {
3176 06 Mar 15 olle 1141         var sortIndex = -1;
3176 06 Mar 15 olle 1142         for (var j = 0; j < specSortedIntQiacubePosition.length; j++)
3176 06 Mar 15 olle 1143         {
3176 06 Mar 15 olle 1144           if (intQiacubePosition == specSortedIntQiacubePosition[j])
3176 06 Mar 15 olle 1145           {
3176 06 Mar 15 olle 1146             sortIndex = j;
3176 06 Mar 15 olle 1147           }
3176 06 Mar 15 olle 1148         }
3176 06 Mar 15 olle 1149         if (sortIndex > -1)
3176 06 Mar 15 olle 1150         {
3176 06 Mar 15 olle 1151           intNanoDropPlatePosition = sortIndex + 1;
3176 06 Mar 15 olle 1152         }
3176 06 Mar 15 olle 1153       }
3352 26 May 15 olle 1154       if (ExtractUtils.isRna(item))
3176 06 Mar 15 olle 1155       {
3176 06 Mar 15 olle 1156         rnaItemNo++;
3176 06 Mar 15 olle 1157         intNanoDropPlatePosition = numSpecimenItems + rnaItemNo;
3176 06 Mar 15 olle 1158       }
3176 06 Mar 15 olle 1159       
3176 06 Mar 15 olle 1160       // Calculate NanoDrop well from Qiacube position
3176 06 Mar 15 olle 1161       var row;
3176 06 Mar 15 olle 1162       var col;
3176 06 Mar 15 olle 1163       // Specimens from up to two QIAcube instruments and input RNA items placed on one NanoDrop plate
3176 06 Mar 15 olle 1164       if (intNanoDropPlatePosition > 16)
3176 06 Mar 15 olle 1165       {
3176 06 Mar 15 olle 1166         // (17 - 24) NanoDrop plate for QIAcube 'A', positions A3 - H3
3176 06 Mar 15 olle 1167         row = intNanoDropPlatePosition - 17;
3176 06 Mar 15 olle 1168         col = 3;
3176 06 Mar 15 olle 1169       }
3176 06 Mar 15 olle 1170       else if (intNanoDropPlatePosition > 8)
3176 06 Mar 15 olle 1171       {
3176 06 Mar 15 olle 1172         // ( 9 - 12) NanoDrop plate for QIAcube 'C', positions A2 - D2
3176 06 Mar 15 olle 1173         // (13 - 16) NanoDrop plate for QIAcube 'A', positions E2 - H2
3176 06 Mar 15 olle 1174         row = intNanoDropPlatePosition - 9;
3176 06 Mar 15 olle 1175         col = 2;
3176 06 Mar 15 olle 1176       }
3176 06 Mar 15 olle 1177       else if (intNanoDropPlatePosition > 0)
3176 06 Mar 15 olle 1178       {
3176 06 Mar 15 olle 1179         // ( 1 -  8) NanoDrop plate for QIAcube 'C', positions A1 - H1
3176 06 Mar 15 olle 1180         row = intNanoDropPlatePosition - 1;
3176 06 Mar 15 olle 1181         col = 1;
3176 06 Mar 15 olle 1182       }
3180 17 Mar 15 olle 1183       if (i < numItems)
3176 06 Mar 15 olle 1184       {
3352 26 May 15 olle 1185         if (!ExtractUtils.isDna(item))
3180 17 Mar 15 olle 1186         {
3276 29 Apr 15 olle 1187           //item.rna.well = Meludi.wellToAlpha(row) + col;
3276 29 Apr 15 olle 1188           item.rna.nanoDropWell = Meludi.wellToAlpha(row) + col;
3180 17 Mar 15 olle 1189         }
3180 17 Mar 15 olle 1190         else
3180 17 Mar 15 olle 1191         {
3276 29 Apr 15 olle 1192           //item.dna.well = null;
3276 29 Apr 15 olle 1193           item.rna.nanoDropWell = null;
3180 17 Mar 15 olle 1194         }
3176 06 Mar 15 olle 1195
3176 06 Mar 15 olle 1196 /*
3180 17 Mar 15 olle 1197         Doc.element('dnaVol'+i).innerHTML = item.dna.volume;
3180 17 Mar 15 olle 1198         Doc.addOrRemoveClass('dnaVol'+i, 'nondefault', item.dna.volume != dnaDefaultVolume);
3180 17 Mar 15 olle 1199 */
3180 17 Mar 15 olle 1200 /*
3180 17 Mar 15 olle 1201         var dnaConc = Doc.element('dnaConc'+i);
3180 17 Mar 15 olle 1202         dnaConc.value = Meludi.formatNumber(item.dna.ndConc) || '';
3180 17 Mar 15 olle 1203         dnaConc.title = '260/280=' + item.dna.nd260by280 + '\n260/230=' + item.dna.nd260by230;
3180 17 Mar 15 olle 1204         if (dnaConc != null)
3176 06 Mar 15 olle 1205         {
3180 17 Mar 15 olle 1206           var dnaConcValue = dnaConc.value;
3180 17 Mar 15 olle 1207           if (dnaConcValue != null && dnaConcValue != '-' && dnaConcValue != '')
3180 17 Mar 15 olle 1208           {
3352 26 May 15 olle 1209             item.dna.ndConc = ExtractUtils.getNumber(dnaConcValue);
3180 17 Mar 15 olle 1210           }
3176 06 Mar 15 olle 1211         }
3180 17 Mar 15 olle 1212         item.dna.quantity = item.dna.qubitConc * item.dna.volume / 1000;
3180 17 Mar 15 olle 1213         Doc.element('dnaQuantity'+i).innerHTML = Meludi.formatNumber(item.dna.quantity || null, null, 2) || '-';
3176 06 Mar 15 olle 1214
3180 17 Mar 15 olle 1215         var deltaCt = Doc.element('deltaCt'+i);
3180 17 Mar 15 olle 1216         if (deltaCt != null)
3180 17 Mar 15 olle 1217         {
3180 17 Mar 15 olle 1218           deltaCt.innerHTML = Meludi.formatNumber(item.dna.deltaCt) || '-';
3180 17 Mar 15 olle 1219         }
3180 17 Mar 15 olle 1220 */      
3276 29 Apr 15 olle 1221         //Doc.element('rnaPos'+i).innerHTML = item.rna.well;
3276 29 Apr 15 olle 1222         Doc.element('rnaPos'+i).innerHTML = item.rna.nanoDropWell;
3180 17 Mar 15 olle 1223         Doc.addOrRemoveClass('rnaPos'+i, 'nondefault', item.qiacubePosition != item.originalQiacubePosition);
3176 06 Mar 15 olle 1224 /*
3180 17 Mar 15 olle 1225         Doc.element('rnaVol'+i).innerHTML = item.rna.volume;
3180 17 Mar 15 olle 1226         Doc.addOrRemoveClass('rnaVol'+i, 'nondefault', item.rna.volume != rnaDefaultVolume);
3180 17 Mar 15 olle 1227         var rnaConc = Doc.element('rnaConc'+i);
3180 17 Mar 15 olle 1228         rnaConc.innerHTML = Meludi.formatNumber(item.rna.ndConc) || '-';
3180 17 Mar 15 olle 1229         rnaConc.title = '260/280=' + item.rna.nd260by280 + '\n260/230=' + item.rna.nd260by230;
3176 06 Mar 15 olle 1230         
3180 17 Mar 15 olle 1231         item.rna.quantity = item.rna.ndConc * item.rna.volume / 1000;
3180 17 Mar 15 olle 1232         var enoughQuantity = item.rna.quantity >= MINIMAL_PRE_NORMALIZE_QUANTITY;
3180 17 Mar 15 olle 1233         item.rna.flag = enoughQuantity ? null : 'NotEnoughRemainingQuantity';
3176 06 Mar 15 olle 1234
3180 17 Mar 15 olle 1235         Doc.element('rnaQuantity'+i).innerHTML = Meludi.formatNumber(item.rna.quantity || null, null, 2) || '-';
3180 17 Mar 15 olle 1236 */
3180 17 Mar 15 olle 1237         var cmnt = Doc.element('comments'+i);
3180 17 Mar 15 olle 1238         var tooltip = [];
3180 17 Mar 15 olle 1239         var comment = [];
3246 14 Apr 15 olle 1240         if (item.operatorDeliveryComment || item.comment || item.dna.comment || item.rna.comment)
3180 17 Mar 15 olle 1241         {
3246 14 Apr 15 olle 1242           // Display operator delivery comments directly in the comment field
3246 14 Apr 15 olle 1243           if (item.operatorDeliveryComment)
3246 14 Apr 15 olle 1244           {
3246 14 Apr 15 olle 1245             comment[0] = item.operatorDeliveryComment;
3246 14 Apr 15 olle 1246             tooltip[tooltip.length] = 'Op.Del.Cmt: ' + item.operatorDeliveryComment;
3246 14 Apr 15 olle 1247           }
3246 14 Apr 15 olle 1248           else
3246 14 Apr 15 olle 1249           {
3246 14 Apr 15 olle 1250             comment[0] = 'Yes';
3246 14 Apr 15 olle 1251           }
3180 17 Mar 15 olle 1252           if (item.comment) tooltip[tooltip.length] = 'Specimen: ' + item.comment;
3180 17 Mar 15 olle 1253           if (item.rna.comment) tooltip[tooltip.length] = 'RNA: ' + item.rna.comment;
3180 17 Mar 15 olle 1254           if (item.dna.comment) tooltip[tooltip.length] = 'DNA: ' + item.dna.comment;
3180 17 Mar 15 olle 1255         }
3176 06 Mar 15 olle 1256         
3180 17 Mar 15 olle 1257         var modifiedReagents = false;
3180 17 Mar 15 olle 1258         for (var rgNo = 0; rgNo < exprep.REAGENTS.length; rgNo++)
3176 06 Mar 15 olle 1259         {
3180 17 Mar 15 olle 1260           var rg = exprep.REAGENTS[rgNo];
3180 17 Mar 15 olle 1261           if (item[rg]) 
3180 17 Mar 15 olle 1262           {
3180 17 Mar 15 olle 1263             tooltip[tooltip.length] = Doc.element(rg+'.title').innerHTML + ': ' + Strings.encodeTags(item[rg]);
3180 17 Mar 15 olle 1264             modifiedReagents = true;
3180 17 Mar 15 olle 1265           }
3176 06 Mar 15 olle 1266         }
3180 17 Mar 15 olle 1267         if (modifiedReagents)
3180 17 Mar 15 olle 1268         {
3180 17 Mar 15 olle 1269           comment[comment.length] = 'Reagents';
3180 17 Mar 15 olle 1270         }
3176 06 Mar 15 olle 1271         
3180 17 Mar 15 olle 1272         if (tooltip.length > 0)
3180 17 Mar 15 olle 1273         {
3180 17 Mar 15 olle 1274           cmnt.innerHTML = comment.join(', ');
3180 17 Mar 15 olle 1275           Doc.addClass(cmnt, 'nondefault');
3180 17 Mar 15 olle 1276           cmnt.title = tooltip.join('\n');
3180 17 Mar 15 olle 1277         }
3180 17 Mar 15 olle 1278         else
3180 17 Mar 15 olle 1279         {
3180 17 Mar 15 olle 1280           cmnt.innerHTML = '';
3180 17 Mar 15 olle 1281           Doc.removeClass(cmnt, 'nondefault');
3180 17 Mar 15 olle 1282           cmnt.title = null;
3180 17 Mar 15 olle 1283         }
3176 06 Mar 15 olle 1284       }
3245 14 Apr 15 olle 1285       else
3245 14 Apr 15 olle 1286       {
3245 14 Apr 15 olle 1287         // Extra QIAcube item
3245 14 Apr 15 olle 1288         var itemNameEl = Doc.element('itemName'+i);
3245 14 Apr 15 olle 1289         if (itemNameEl != null)
3245 14 Apr 15 olle 1290         {
3245 14 Apr 15 olle 1291           itemNameEl.value = Strings.encodeTags(item.name);
3245 14 Apr 15 olle 1292         }
3245 14 Apr 15 olle 1293       }
3176 06 Mar 15 olle 1294     }
3176 06 Mar 15 olle 1295
3176 06 Mar 15 olle 1296     if (duplicatePosition)
3176 06 Mar 15 olle 1297     {
3354 27 May 15 olle 1298       var duplicatePositionStr = ExtractUtils.getDetailedQiacubePosition(duplicatePosition, qiacubeSortedPrefixes);
3176 06 Mar 15 olle 1299       Wizard.setInputStatus('downloadSampleIdFile', 'invalid', 'Duplicate QIAcube position: ' + duplicatePositionStr);
3176 06 Mar 15 olle 1300       qiacubePositionsAreValid = false;
3176 06 Mar 15 olle 1301     }
3176 06 Mar 15 olle 1302     else
3176 06 Mar 15 olle 1303     {
3176 06 Mar 15 olle 1304       Wizard.setInputStatus('downloadSampleIdFile');
3176 06 Mar 15 olle 1305       qiacubePositionsAreValid = true;
3176 06 Mar 15 olle 1306     }
3176 06 Mar 15 olle 1307   }
3176 06 Mar 15 olle 1308
3176 06 Mar 15 olle 1309   exprep.downloadSampleIdFile = function()
3176 06 Mar 15 olle 1310   {
3176 06 Mar 15 olle 1311     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 1312
3176 06 Mar 15 olle 1313     if (!qiacubePositionsAreValid)
3176 06 Mar 15 olle 1314     {
3176 06 Mar 15 olle 1315       Forms.showNotification('downloadSampleIdFile', 'QIAcube positions are not valid. Please fix before downloading the file.');
3176 06 Mar 15 olle 1316       return;
3176 06 Mar 15 olle 1317     }
3176 06 Mar 15 olle 1318
3176 06 Mar 15 olle 1319     var itemNames = [];
3176 06 Mar 15 olle 1320     var url = '../Extraction.servlet?ID='+App.getSessionId();
3176 06 Mar 15 olle 1321     url += '&cmd=DownloadNanoDropSampleIdFile';
3432 29 Jun 15 olle 1322     url += '&startListName='+encodeURIComponent(frm.startListName.value);
3176 06 Mar 15 olle 1323     url += '&qiacubeDate='+encodeURIComponent(frm.qiacubeDate.value);
3176 06 Mar 15 olle 1324     url += '&qiacubeRunNo='+encodeURIComponent(frm.qiacubeRunNo.value);
3255 17 Apr 15 olle 1325     url += '&blankControlColumn='+encodeURIComponent(frm.blankControlColumn.checked);
3176 06 Mar 15 olle 1326     
3176 06 Mar 15 olle 1327     // Get list of selected extract source items
3176 06 Mar 15 olle 1328     var selItemsList = exprep.getSelectedItemsList();
3176 06 Mar 15 olle 1329     var numItems = selItemsList.length;
3176 06 Mar 15 olle 1330     var itemNo = 0;
3176 06 Mar 15 olle 1331     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 1332     {
3176 06 Mar 15 olle 1333       var item = selItemsList[i];
3352 26 May 15 olle 1334       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3176 06 Mar 15 olle 1335       {
3176 06 Mar 15 olle 1336         itemNames[itemNo] = item.name;
3176 06 Mar 15 olle 1337         itemNo++;
3176 06 Mar 15 olle 1338       }
3176 06 Mar 15 olle 1339     }
3176 06 Mar 15 olle 1340     url += '&itemNames=' + encodeURIComponent(itemNames.join(','));
3176 06 Mar 15 olle 1341     window.open(url);
3176 06 Mar 15 olle 1342   }
3176 06 Mar 15 olle 1343
3176 06 Mar 15 olle 1344   exprep.downloadQPcrSampleIdFile = function()
3176 06 Mar 15 olle 1345   {
3176 06 Mar 15 olle 1346     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 1347     var itemNames = [];
3176 06 Mar 15 olle 1348     var url = '../Extraction.servlet?ID='+App.getSessionId();
3176 06 Mar 15 olle 1349     url += '&cmd=DownloadQPcrSampleIdFile';
3432 29 Jun 15 olle 1350     url += '&startListName='+encodeURIComponent(frm.startListName.value);
3176 06 Mar 15 olle 1351     url += '&qiacubeDate='+encodeURIComponent(frm.qiacubeDate.value);
3176 06 Mar 15 olle 1352     url += '&qiacubeRunNo='+encodeURIComponent(frm.qiacubeRunNo.value);
3176 06 Mar 15 olle 1353
3176 06 Mar 15 olle 1354     // Get list of selected extract source items
3176 06 Mar 15 olle 1355     var selItemsList = exprep.getSelectedItemsList();
3176 06 Mar 15 olle 1356     var numItems = selItemsList.length;
3176 06 Mar 15 olle 1357     var itemNo = 0;
3176 06 Mar 15 olle 1358     for (var i = 0; i < numItems; i++)
3176 06 Mar 15 olle 1359     {
3176 06 Mar 15 olle 1360       var item = selItemsList[i];
3352 26 May 15 olle 1361       if (ExtractUtils.isSpecimen(item) || ExtractUtils.isDna(item))
3176 06 Mar 15 olle 1362       {
3176 06 Mar 15 olle 1363         itemNames[itemNo] = item.name;
3176 06 Mar 15 olle 1364         itemNo++;
3176 06 Mar 15 olle 1365       }
3176 06 Mar 15 olle 1366     }
3176 06 Mar 15 olle 1367     url += '&itemNames=' + encodeURIComponent(itemNames.join(','));
3176 06 Mar 15 olle 1368     window.open(url);
3176 06 Mar 15 olle 1369   }
3176 06 Mar 15 olle 1370
3176 06 Mar 15 olle 1371   exprep.validateStep3 = function(event)
3176 06 Mar 15 olle 1372   {
3176 06 Mar 15 olle 1373     var valid = true;
3176 06 Mar 15 olle 1374     valid &= qiacubePositionsAreValid;
3176 06 Mar 15 olle 1375     
3176 06 Mar 15 olle 1376     if (!valid) event.preventDefault();
3176 06 Mar 15 olle 1377   }
3176 06 Mar 15 olle 1378
3180 17 Mar 15 olle 1379   exprep.submit = function()
3180 17 Mar 15 olle 1380   {
3180 17 Mar 15 olle 1381     //alert("exprep.submit(): Start");
3180 17 Mar 15 olle 1382     var frm = document.forms['meludi'];
3180 17 Mar 15 olle 1383     
3180 17 Mar 15 olle 1384     var submitInfo = {};
3180 17 Mar 15 olle 1385     submitInfo.items = [];
3245 14 Apr 15 olle 1386     submitInfo.extraItems = [];
3180 17 Mar 15 olle 1387
3180 17 Mar 15 olle 1388     // Get list of selected extract source items
3180 17 Mar 15 olle 1389     var selItemsList = exprep.getSelectedItemsList();
3180 17 Mar 15 olle 1390     var numItems = selItemsList.length;
3413 23 Jun 15 olle 1391     var totNumItems = numItems;
3245 14 Apr 15 olle 1392     for (var i = 0; i < totNumItems; i++)
3180 17 Mar 15 olle 1393     {
3245 14 Apr 15 olle 1394       var item = null;
3245 14 Apr 15 olle 1395       if (i < numItems)
3245 14 Apr 15 olle 1396       {
3245 14 Apr 15 olle 1397         item = selItemsList[i];
3245 14 Apr 15 olle 1398         submitInfo.items[submitInfo.items.length] = item;
3245 14 Apr 15 olle 1399       }
3180 17 Mar 15 olle 1400     }
3180 17 Mar 15 olle 1401     
3180 17 Mar 15 olle 1402     // Extraction
3432 29 Jun 15 olle 1403     submitInfo.startListName = frm.startListName.value;
3180 17 Mar 15 olle 1404     submitInfo.isolationDate = frm.isolationDate.value;
3501 21 Sep 15 olle 1405     submitInfo.extractionOperator = frm.extractionOperator.value;
3180 17 Mar 15 olle 1406     submitInfo.extractionProtocol = parseInt(frm.extractionProtocol.value, 10);
3180 17 Mar 15 olle 1407     var extractionProtocolName = '';
3180 17 Mar 15 olle 1408     var extractionProtocol = frm.extractionProtocol.value;
3180 17 Mar 15 olle 1409     if (extractionProtocol)
3180 17 Mar 15 olle 1410     {
3180 17 Mar 15 olle 1411       extractionProtocolName = protocolMap[extractionProtocol];
3180 17 Mar 15 olle 1412     }
3180 17 Mar 15 olle 1413     submitInfo.extractionProtocolName = extractionProtocolName;
3176 06 Mar 15 olle 1414 /*
3352 26 May 15 olle 1415     submitInfo.rnaDefaultVolume = ExtractUtils.getNumber(frm.rnaDefaultVolume.value);
3352 26 May 15 olle 1416     submitInfo.dnaDefaultVolume = ExtractUtils.getNumber(frm.dnaDefaultVolume.value);
3180 17 Mar 15 olle 1417 */
3180 17 Mar 15 olle 1418
3180 17 Mar 15 olle 1419     // QIAcube
3180 17 Mar 15 olle 1420     submitInfo.qiacubeDate = frm.qiacubeDate.value;
3180 17 Mar 15 olle 1421     submitInfo.qiacubePrimaryPrefix = frm.qiacubePrimaryPrefix.value;
3180 17 Mar 15 olle 1422     submitInfo.qiacubeSecondaryPrefix = frm.qiacubeSecondaryPrefix.value;
3180 17 Mar 15 olle 1423     submitInfo.qiacubeRunNo = parseInt(frm.qiacubeRunNo.value, 10);
3180 17 Mar 15 olle 1424     submitInfo.qiacubeOperator = frm.qiacubeOperator.value;
3180 17 Mar 15 olle 1425     submitInfo.allPrepFfpeKit = frm.allPrepFfpeKit.value;
3180 17 Mar 15 olle 1426
3180 17 Mar 15 olle 1427     // Reagents
3180 17 Mar 15 olle 1428     for (var i = 0; i < exprep.REAGENTS.length; i++)
3180 17 Mar 15 olle 1429     {
3180 17 Mar 15 olle 1430       var rg = exprep.REAGENTS[i];
3180 17 Mar 15 olle 1431       submitInfo[rg] = frm[rg].value;
3180 17 Mar 15 olle 1432     }
3180 17 Mar 15 olle 1433     var url = '../Extraction.servlet?ID='+App.getSessionId();
3432 29 Jun 15 olle 1434     url += '&cmd=RegisterStartItemList';
3180 17 Mar 15 olle 1435     //alert("exprep.submit(): url = " + url);
3180 17 Mar 15 olle 1436     Wizard.showLoadingAnimation('Performing registration...');
3180 17 Mar 15 olle 1437     Wizard.asyncJsonRequest(url, exprep.submissionResults, 'POST', JSON.stringify(submitInfo));
3180 17 Mar 15 olle 1438   }
3180 17 Mar 15 olle 1439   
3176 06 Mar 15 olle 1440   exprep.submissionResults = function(response)
3176 06 Mar 15 olle 1441   {
3176 06 Mar 15 olle 1442     Wizard.showFinalMessage(response.messages);
3176 06 Mar 15 olle 1443     Doc.show('gorestart');
3199 19 Mar 15 olle 1444     Doc.show('gocreate');
3336 13 May 15 olle 1445     trackingProtocolPreview = false;
3432 29 Jun 15 olle 1446     if (response.createdStartList && response.createdStartList.length > 0)
3176 06 Mar 15 olle 1447     {
3432 29 Jun 15 olle 1448       createdStartList = response.createdStartList;
3176 06 Mar 15 olle 1449     }
5858 10 Mar 20 olle 1450     Doc.show('downloaddnarnalabelfile');
3176 06 Mar 15 olle 1451   }
3176 06 Mar 15 olle 1452
3176 06 Mar 15 olle 1453   exprep.createProtocol = function()
3176 06 Mar 15 olle 1454   {
3176 06 Mar 15 olle 1455     var frm = document.forms['meludi'];
3176 06 Mar 15 olle 1456     var submitInfo = {};
3176 06 Mar 15 olle 1457     submitInfo.items = [];
3176 06 Mar 15 olle 1458
3336 13 May 15 olle 1459     submitInfo.docMode = 'protocol';
3176 06 Mar 15 olle 1460     // Get list of selected extract source items
3176 06 Mar 15 olle 1461     var selItemsList = exprep.getSelectedItemsList();
3176 06 Mar 15 olle 1462     var numItems = selItemsList.length;
3413 23 Jun 15 olle 1463     var totNumItems = numItems;
3180 17 Mar 15 olle 1464     for (var i = 0; i < totNumItems; i++)
3176 06 Mar 15 olle 1465     {
3180 17 Mar 15 olle 1466       var item = null;
3180 17 Mar 15 olle 1467       if (i < numItems)
3180 17 Mar 15 olle 1468       {
3180 17 Mar 15 olle 1469         item = selItemsList[i];
3180 17 Mar 15 olle 1470       }
3176 06 Mar 15 olle 1471       submitInfo.items[submitInfo.items.length] = item;
3176 06 Mar 15 olle 1472     }
3176 06 Mar 15 olle 1473
3176 06 Mar 15 olle 1474     // Extraction
3432 29 Jun 15 olle 1475     submitInfo.startListName = frm.startListName.value;
3180 17 Mar 15 olle 1476     submitInfo.isolationDate = frm.isolationDate.value;
3501 21 Sep 15 olle 1477     submitInfo.extractionOperator = frm.extractionOperator.value;
3176 06 Mar 15 olle 1478 /*
3176 06 Mar 15 olle 1479     submitInfo.extractionProtocol = parseInt(frm.extractionProtocol.value, 10);
3176 06 Mar 15 olle 1480 */
3176 06 Mar 15 olle 1481     var extractionProtocolName = '';
3176 06 Mar 15 olle 1482     var extractionProtocol = frm.extractionProtocol.value;
3176 06 Mar 15 olle 1483     if (extractionProtocol)
3176 06 Mar 15 olle 1484     {
3176 06 Mar 15 olle 1485       extractionProtocolName = protocolMap[extractionProtocol];
3176 06 Mar 15 olle 1486     }
3176 06 Mar 15 olle 1487     var protocolVersionNo = '';
3176 06 Mar 15 olle 1488     if (extractionProtocolName)
3176 06 Mar 15 olle 1489     {
3202 19 Mar 15 olle 1490       protocolVersionNo = extractionProtocolName;
3202 19 Mar 15 olle 1491       // Remove part of string up to and including last "v"
3202 19 Mar 15 olle 1492       var vIndex = protocolVersionNo.indexOf('v');
3202 19 Mar 15 olle 1493       while (vIndex >= 0)
3176 06 Mar 15 olle 1494       {
3202 19 Mar 15 olle 1495         // Remove part of string up to and including first "v"
3202 19 Mar 15 olle 1496         protocolVersionNo = protocolVersionNo.substring(vIndex + 1);
3202 19 Mar 15 olle 1497         vIndex = protocolVersionNo.indexOf('v');
3176 06 Mar 15 olle 1498       }
3176 06 Mar 15 olle 1499     }
3199 19 Mar 15 olle 1500     var protocolPreviewFlag = null;
3336 13 May 15 olle 1501     if (trackingProtocolPreview)
3199 19 Mar 15 olle 1502     {
3199 19 Mar 15 olle 1503       protocolPreviewFlag = 'true';
3199 19 Mar 15 olle 1504     }
3176 06 Mar 15 olle 1505     submitInfo.extractionProtocolName = extractionProtocolName;
3176 06 Mar 15 olle 1506     submitInfo.protocolVersionNo = protocolVersionNo;
3199 19 Mar 15 olle 1507     submitInfo.protocolPreviewFlag = protocolPreviewFlag;
3180 17 Mar 15 olle 1508 /*
3352 26 May 15 olle 1509     submitInfo.dnaDefaultVolume = ExtractUtils.getNumber(frm.dnaDefaultVolume.value);
3180 17 Mar 15 olle 1510 */
3180 17 Mar 15 olle 1511     submitInfo.dnaDefaultVolume = null;
3176 06 Mar 15 olle 1512     
3501 21 Sep 15 olle 1513     // Specimen reagents
3501 21 Sep 15 olle 1514     submitInfo.xyleneSpecimen = frm.xyleneSpecimen.value;
3501 21 Sep 15 olle 1515     submitInfo.etoh995Specimen = frm.etoh995Specimen.value;
3501 21 Sep 15 olle 1516     submitInfo.allPrepFfpeKit = frm.allPrepFfpeKit.value;
3501 21 Sep 15 olle 1517     submitInfo.bufferPkdSpecimen = frm.bufferPkdSpecimen.value;
3501 21 Sep 15 olle 1518     submitInfo.bufferAtlSpecimen = frm.bufferAtlSpecimen.value;
3501 21 Sep 15 olle 1519     submitInfo.proteinaseKSpecimen = frm.proteinaseKSpecimen.value;
3501 21 Sep 15 olle 1520     submitInfo.rnaseASpecimen = frm.rnaseASpecimen.value;
3501 21 Sep 15 olle 1521
3176 06 Mar 15 olle 1522     // QIAcube
3176 06 Mar 15 olle 1523     submitInfo.qiacubeDate = frm.qiacubeDate.value;
3501 21 Sep 15 olle 1524     submitInfo.qiacubeOperator = frm.qiacubeOperator.value;
3176 06 Mar 15 olle 1525     submitInfo.qiacubeRunNo = parseInt(frm.qiacubeRunNo.value, 10);
3501 21 Sep 15 olle 1526     submitInfo.etoh995 = frm.etoh995.value;
3501 21 Sep 15 olle 1527     submitInfo.bufferRlt = frm.bufferRlt.value;
3501 21 Sep 15 olle 1528     submitInfo.bufferFrn = frm.bufferFrn.value;
3501 21 Sep 15 olle 1529     submitInfo.bufferRpe = frm.bufferRpe.value;
3501 21 Sep 15 olle 1530     submitInfo.bufferAl = frm.bufferAl.value;
3501 21 Sep 15 olle 1531     submitInfo.bufferAw1 = frm.bufferAw1.value;
3501 21 Sep 15 olle 1532     submitInfo.bufferAw2 = frm.bufferAw2.value;
3501 21 Sep 15 olle 1533     submitInfo.bufferAte = frm.bufferAte.value;
3501 21 Sep 15 olle 1534     submitInfo.bufferRdd = frm.bufferRdd.value;
3501 21 Sep 15 olle 1535     submitInfo.rnaseFreeWater = frm.rnaseFreeWater.value;
3501 21 Sep 15 olle 1536     submitInfo.dnaseMix = frm.dnaseMix.value;
3501 21 Sep 15 olle 1537     submitInfo.rneasyMinEluteSpinColumn = frm.rneasyMinEluteSpinColumn.value;
3501 21 Sep 15 olle 1538     submitInfo.qiaampMinEluteSpinColumn = frm.qiaampMinEluteSpinColumn.value;
3176 06 Mar 15 olle 1539
3501 21 Sep 15 olle 1540     // Quality control reagents
3501 21 Sep 15 olle 1541     submitInfo.kapaSybrFast = frm.kapaSybrFast.value;
3501 21 Sep 15 olle 1542     submitInfo.qualityControlPrimersQcpRgt = frm.qualityControlPrimersQcpRgt.value;
3501 21 Sep 15 olle 1543     submitInfo.qualityControlTemplateQct = frm.qualityControlTemplateQct.value;
3501 21 Sep 15 olle 1544     submitInfo.qubitDnaHighSens = frm.qubitDnaHighSens.value;
3501 21 Sep 15 olle 1545     submitInfo.qubitDnaBroadRange = frm.qubitDnaBroadRange.value;
3501 21 Sep 15 olle 1546
3176 06 Mar 15 olle 1547     // Save values in hidden input fields for retrieval after HTML request
3176 06 Mar 15 olle 1548     var submitInfoJsonStr = JSON.stringify(submitInfo);
3176 06 Mar 15 olle 1549     frm.hiddenSubmitInfo.value = submitInfoJsonStr;
3176 06 Mar 15 olle 1550     frm.hiddenNumItems.value = submitInfo.items.length;
3176 06 Mar 15 olle 1551     frm.hiddenCounterBalanceInfoRow.value = counterBalanceInfoRow;
3176 06 Mar 15 olle 1552
3176 06 Mar 15 olle 1553     // Calling frm.submit() will change jsp file to extraction_protocol2.jsp
3176 06 Mar 15 olle 1554     frm.submit();
3176 06 Mar 15 olle 1555   }
3176 06 Mar 15 olle 1556
5858 10 Mar 20 olle 1557   exprep.downloadDnaRnaLabelFile = function()
5858 10 Mar 20 olle 1558   {
5858 10 Mar 20 olle 1559     var frm = document.forms['meludi'];
5858 10 Mar 20 olle 1560     // Get list of selected extract source items
5858 10 Mar 20 olle 1561     var selItemsList = exprep.getSelectedItemsList();
5858 10 Mar 20 olle 1562     //alert("extraction_preparation.js::downloadDnaRnaLabelFile: selItemsList = " + JSON.stringify(selItemsList));
5858 10 Mar 20 olle 1563     var numItems = selItemsList.length;
5858 10 Mar 20 olle 1564     //alert("extraction_preparation.js::downloadDnaRnaLabelFile: numItems = " + numItems);
5858 10 Mar 20 olle 1565 /*
5858 10 Mar 20 olle 1566     var totNumItems = numItems;
5858 10 Mar 20 olle 1567     for (var i = 0; i < totNumItems; i++)
5858 10 Mar 20 olle 1568     {
5858 10 Mar 20 olle 1569       var item = null;
5858 10 Mar 20 olle 1570       if (i < numItems)
5858 10 Mar 20 olle 1571       {
5858 10 Mar 20 olle 1572         item = selItemsList[i];
5858 10 Mar 20 olle 1573       }
5858 10 Mar 20 olle 1574       submitInfo.items[submitInfo.items.length] = item;
5858 10 Mar 20 olle 1575     }
5858 10 Mar 20 olle 1576 */
5858 10 Mar 20 olle 1577     var preview = false;
5858 10 Mar 20 olle 1578
5858 10 Mar 20 olle 1579     var url = '../LabelGeneration.servlet?ID=' + App.getSessionId();
5858 10 Mar 20 olle 1580     url += '&cmd=GetDnaRnaLabelFile';
5858 10 Mar 20 olle 1581     url += '&selitemslist='+encodeURIComponent(JSON.stringify(selItemsList));
5858 10 Mar 20 olle 1582     url += '&preview=' + preview;
5858 10 Mar 20 olle 1583     //alert("extraction_preparation.js::downloadDnaRnaLabelFile: (0) url = " + url);
5858 10 Mar 20 olle 1584
5858 10 Mar 20 olle 1585 /*
5858 10 Mar 20 olle 1586     if (preview) 
5858 10 Mar 20 olle 1587     {
5858 10 Mar 20 olle 1588       Doc.hide('previewWrapper');
5858 10 Mar 20 olle 1589       url += '&preview=1';
5858 10 Mar 20 olle 1590       
5858 10 Mar 20 olle 1591       Wizard.showLoadingAnimation('Working...');
5858 10 Mar 20 olle 1592       Doc.hide('navigation');
5858 10 Mar 20 olle 1593       Wizard.asyncJsonRequest(url, istat.onPreviewLoaded);
5858 10 Mar 20 olle 1594     }
5858 10 Mar 20 olle 1595     else
5858 10 Mar 20 olle 1596     {
5858 10 Mar 20 olle 1597       //window.location = url;    
5858 10 Mar 20 olle 1598       window.open(url);    
5858 10 Mar 20 olle 1599     }
5858 10 Mar 20 olle 1600 */
5858 10 Mar 20 olle 1601     window.open(url);    
5858 10 Mar 20 olle 1602   }
5858 10 Mar 20 olle 1603
3176 06 Mar 15 olle 1604   return exprep;
3176 06 Mar 15 olle 1605 }();
3176 06 Mar 15 olle 1606
3176 06 Mar 15 olle 1607 Doc.onLoad(ExtractionPrep.initPage);
3176 06 Mar 15 olle 1608