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

Code
Comments
Other
Rev Date Author Line
3502 22 Sep 15 olle 1 var ExtractionStartListRemoval = function()
3502 22 Sep 15 olle 2 {
3502 22 Sep 15 olle 3   var exreg = {};
3502 22 Sep 15 olle 4   var debug = 0;
3502 22 Sep 15 olle 5
3502 22 Sep 15 olle 6   var extraItemsList = [];
3502 22 Sep 15 olle 7   var qiacubeSortedPrefixes = 'BCADEFGHIJKLMNOPQRSTUVWXYZ';
3502 22 Sep 15 olle 8   var qiacubeDateIsAfterIsolationDate = true;
3502 22 Sep 15 olle 9   var qiacubeRunNoIsValid = false;
3502 22 Sep 15 olle 10   var qiacubePositionsAreValid = false;
3502 22 Sep 15 olle 11   var counterBalanceInfoRow = false;
3502 22 Sep 15 olle 12   var createdRna = [];
3502 22 Sep 15 olle 13   
3502 22 Sep 15 olle 14   // Page initialization
3502 22 Sep 15 olle 15   exreg.initPage = function()
3502 22 Sep 15 olle 16   {
3502 22 Sep 15 olle 17     // Step 1
3502 22 Sep 15 olle 18     Events.addEventHandler('step-1', 'wizard-validate', exreg.validateStep1);
3502 22 Sep 15 olle 19
3502 22 Sep 15 olle 20     // Step 2
3502 22 Sep 15 olle 21     Events.addEventHandler('step-2', 'wizard-initialize', exreg.initializeStep2);
3502 22 Sep 15 olle 22     Events.addEventHandler('step-2', 'wizard-validate', exreg.validateStep2);
3502 22 Sep 15 olle 23     
3502 22 Sep 15 olle 24     Events.addEventHandler('isolationDate', 'change', Wizard.validateDate);
3502 22 Sep 15 olle 25     Events.addEventHandler('qiacubeDate', 'change', Wizard.validateDate);
3502 22 Sep 15 olle 26     Events.addEventHandler('isolationDate', 'change', exreg.qiacubeDateOnChange);
3502 22 Sep 15 olle 27     Events.addEventHandler('qiacubeDate', 'change', exreg.qiacubeDateOnChange);
3502 22 Sep 15 olle 28     Events.addEventHandler('qiacubeRunNo', 'change', exreg.qiacubeRunNoOnChange);
3502 22 Sep 15 olle 29
3502 22 Sep 15 olle 30     // Step 3
3502 22 Sep 15 olle 31     Events.addEventHandler('step-3', 'wizard-initialize', exreg.initializeStep3);
3502 22 Sep 15 olle 32     Events.addEventHandler('step-3', 'wizard-validate', exreg.validateStep3);
3502 22 Sep 15 olle 33
3502 22 Sep 15 olle 34     // Navigation
3502 22 Sep 15 olle 35     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
3502 22 Sep 15 olle 36     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
3502 22 Sep 15 olle 37     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
3502 22 Sep 15 olle 38     Buttons.addClickHandler('goregister', Wizard.goRegister);
3502 22 Sep 15 olle 39     
3502 22 Sep 15 olle 40     // Final registration
3502 22 Sep 15 olle 41     Events.addEventHandler('wizard', 'wizard-submit', exreg.submit);
3502 22 Sep 15 olle 42
3502 22 Sep 15 olle 43     var url = '../Extraction.servlet?ID='+App.getSessionId();
3502 22 Sep 15 olle 44     url += '&cmd=GetUnprocessedStartItemLists';
3502 22 Sep 15 olle 45     url += '&orderDesc=true';    
3502 22 Sep 15 olle 46     Wizard.showLoadingAnimation('Loading unprocessed items...');
3502 22 Sep 15 olle 47     Wizard.asyncJsonRequest(url, exreg.initializeStep1);
3502 22 Sep 15 olle 48   }
3502 22 Sep 15 olle 49   
3502 22 Sep 15 olle 50   exreg.initializeStep1 = function(response)
3502 22 Sep 15 olle 51   {
3502 22 Sep 15 olle 52     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 53     var itemLists = response.itemLists;
3502 22 Sep 15 olle 54     
3502 22 Sep 15 olle 55     var startList = frm.startList;
3502 22 Sep 15 olle 56     if (itemLists.length > 0)
3502 22 Sep 15 olle 57     {
3502 22 Sep 15 olle 58       for (var i=0; i < itemLists.length; i++)
3502 22 Sep 15 olle 59       {
3502 22 Sep 15 olle 60         var itemList = itemLists[i];
3502 22 Sep 15 olle 61         var name = (i+1) + ': ' + Strings.encodeTags(itemList.name);
3502 22 Sep 15 olle 62         if (itemList.sourceItemNames)
3502 22 Sep 15 olle 63         {
3502 22 Sep 15 olle 64           name += ' -- (';
3502 22 Sep 15 olle 65           name += itemList.numMeludiItems;
3502 22 Sep 15 olle 66           name += ' + ' + itemList.numExtraItems;
3502 22 Sep 15 olle 67           name += ')';
3502 22 Sep 15 olle 68         }
3502 22 Sep 15 olle 69         if (itemList.extractionDate)
3502 22 Sep 15 olle 70         {
3502 22 Sep 15 olle 71           name += ' -- [' + exreg.asDate(itemList.extractionDate) + ']';
3502 22 Sep 15 olle 72         }
3502 22 Sep 15 olle 73         var selected = i == (itemLists.length - 1);
3502 22 Sep 15 olle 74         var option = new Option(name, itemList.id, selected, selected);
3502 22 Sep 15 olle 75         option.itemList = itemList;
3502 22 Sep 15 olle 76         startList.options[startList.length] = option;
3502 22 Sep 15 olle 77       }
3502 22 Sep 15 olle 78       startList.options[0].selected = true;
3502 22 Sep 15 olle 79     }
3502 22 Sep 15 olle 80     else
3502 22 Sep 15 olle 81     {
3502 22 Sep 15 olle 82       Wizard.setFatalError('No start lists available.');
3502 22 Sep 15 olle 83       return;
3502 22 Sep 15 olle 84     }
3502 22 Sep 15 olle 85     Doc.show('step-1');
3502 22 Sep 15 olle 86     Doc.show('gonext');
3502 22 Sep 15 olle 87     Doc.hide('extractSourceItems');
3502 22 Sep 15 olle 88   }
3502 22 Sep 15 olle 89
3502 22 Sep 15 olle 90   exreg.validateStep1 = function(event)
3502 22 Sep 15 olle 91   {
3502 22 Sep 15 olle 92     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 93     var startList = null;
3502 22 Sep 15 olle 94     for (var i = 0; i < frm.startList.length; i++)
3502 22 Sep 15 olle 95     {
3502 22 Sep 15 olle 96       if (frm.startList[i].selected)
3502 22 Sep 15 olle 97       {
3502 22 Sep 15 olle 98         startList = frm.startList[i];
3502 22 Sep 15 olle 99       }
3502 22 Sep 15 olle 100     }
3502 22 Sep 15 olle 101     if (startList == null)
3502 22 Sep 15 olle 102     {
3502 22 Sep 15 olle 103       event.preventDefault();
3502 22 Sep 15 olle 104     }
3502 22 Sep 15 olle 105   }
3502 22 Sep 15 olle 106   
3502 22 Sep 15 olle 107   exreg.initializeStep2 = function()
3502 22 Sep 15 olle 108   {
3502 22 Sep 15 olle 109     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 110     var startItemList = null;
3502 22 Sep 15 olle 111     for (var i = 0; i < frm.startList.length; i++)
3502 22 Sep 15 olle 112     {
3502 22 Sep 15 olle 113       if (frm.startList[i].selected)
3502 22 Sep 15 olle 114       {
3502 22 Sep 15 olle 115         startItemList = frm.startList[i];
3502 22 Sep 15 olle 116       }
3502 22 Sep 15 olle 117     }
3502 22 Sep 15 olle 118     if (startItemList == null)
3502 22 Sep 15 olle 119     {
3502 22 Sep 15 olle 120       event.preventDefault();
3502 22 Sep 15 olle 121     }
3502 22 Sep 15 olle 122
3502 22 Sep 15 olle 123     frm.startList.disabled = true;
3502 22 Sep 15 olle 124
3502 22 Sep 15 olle 125     Wizard.setCurrentStep(2);
3502 22 Sep 15 olle 126     Doc.show('gocancel');
3502 22 Sep 15 olle 127     Doc.show('gonext');
3502 22 Sep 15 olle 128     Doc.hide('extractionProtocolId');
3502 22 Sep 15 olle 129
3502 22 Sep 15 olle 130     frm.isolationDate.focus();
3502 22 Sep 15 olle 131     Events.sendChangeEvent('isolationDate');
3502 22 Sep 15 olle 132     Events.sendChangeEvent('qiacubeDate');
3502 22 Sep 15 olle 133
3502 22 Sep 15 olle 134     var url = '../Extraction.servlet?ID='+App.getSessionId();
3502 22 Sep 15 olle 135     url += '&cmd=GetSourceItemListFromStartItemList';
3502 22 Sep 15 olle 136     url += '&startItemListId='+startItemList.value;
3502 22 Sep 15 olle 137     Wizard.asyncJsonRequest(url, exreg.sourceItemListLoaded);
3502 22 Sep 15 olle 138   }
3502 22 Sep 15 olle 139
3502 22 Sep 15 olle 140   exreg.sourceItemListLoaded = function(response)
3502 22 Sep 15 olle 141   {
3502 22 Sep 15 olle 142     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 143
3502 22 Sep 15 olle 144     var startItemList = response.startitemlist;
3502 22 Sep 15 olle 145     var specimens = response.specimens;
3502 22 Sep 15 olle 146     var rnas = response.rnas;
3502 22 Sep 15 olle 147     var dnas = response.dnas;
3502 22 Sep 15 olle 148     var items = response.items;
3502 22 Sep 15 olle 149     var startListIsProcessed = false;
3502 22 Sep 15 olle 150     extraItemsList = response.extraitems;
3502 22 Sep 15 olle 151
3502 22 Sep 15 olle 152     if (startItemList)
3502 22 Sep 15 olle 153     {
3502 22 Sep 15 olle 154       // Extraction parameters
3502 22 Sep 15 olle 155       frm.startListName.value = startItemList.name;
3502 22 Sep 15 olle 156       // Extraction parameters
3502 22 Sep 15 olle 157       frm.isolationDate.value = startItemList.isolationDate;
3502 22 Sep 15 olle 158       frm.extractionOperator.value = startItemList.extractionOperator;
3502 22 Sep 15 olle 159       frm.extractionProtocolId.value = startItemList.extractionProtocolId;
3502 22 Sep 15 olle 160       frm.extractionProtocolName.value = startItemList.extractionProtocolName;
3502 22 Sep 15 olle 161
3502 22 Sep 15 olle 162       // QIAcube parameters
3502 22 Sep 15 olle 163       frm.qiacubeDate.value = startItemList.qiacubeDate;
3502 22 Sep 15 olle 164       frm.qiacubeOperator.value = startItemList.qiacubeOperator;
3502 22 Sep 15 olle 165       frm.qiacubePrimaryPrefix.value = startItemList.qiacubePrimaryPrefix;
3502 22 Sep 15 olle 166       frm.qiacubeSecondaryPrefix.value = startItemList.qiacubeSecondaryPrefix;
3502 22 Sep 15 olle 167       frm.qiacubeRunNo.value = startItemList.qiacubeRunNo;
3502 22 Sep 15 olle 168
3502 22 Sep 15 olle 169       // Specimen reagents
3502 22 Sep 15 olle 170       frm.xyleneSpecimen.value = startItemList.xyleneSpecimen;
3502 22 Sep 15 olle 171       frm.etoh995Specimen.value = startItemList.etoh995Specimen;
3502 22 Sep 15 olle 172       frm.allPrepFfpeKit.value = startItemList.allPrepFfpeKit;
3502 22 Sep 15 olle 173       frm.bufferPkdSpecimen.value = startItemList.bufferPkdSpecimen;
3502 22 Sep 15 olle 174       frm.bufferAtlSpecimen.value = startItemList.bufferAtlSpecimen;
3502 22 Sep 15 olle 175       frm.proteinaseKSpecimen.value = startItemList.proteinaseKSpecimen;
3502 22 Sep 15 olle 176       frm.rnaseASpecimen.value = startItemList.rnaseASpecimen;
3502 22 Sep 15 olle 177
3502 22 Sep 15 olle 178       // QIAcube reagents
3502 22 Sep 15 olle 179       frm.etoh995.value = startItemList.etoh995;
3502 22 Sep 15 olle 180       frm.bufferRlt.value = startItemList.bufferRlt;
3502 22 Sep 15 olle 181       frm.bufferFrn.value = startItemList.bufferFrn;
3502 22 Sep 15 olle 182       frm.bufferRpe.value = startItemList.bufferRpe;
3502 22 Sep 15 olle 183       frm.bufferAl.value = startItemList.bufferAl;
3502 22 Sep 15 olle 184       frm.bufferAw1.value = startItemList.bufferAw1;
3502 22 Sep 15 olle 185       frm.bufferAw2.value = startItemList.bufferAw2;
3502 22 Sep 15 olle 186       frm.bufferAte.value = startItemList.bufferAte;
3502 22 Sep 15 olle 187       frm.bufferRdd.value = startItemList.bufferRdd;
3502 22 Sep 15 olle 188       frm.rnaseFreeWater.value = startItemList.rnaseFreeWater;
3502 22 Sep 15 olle 189       frm.dnaseMix.value = startItemList.dnaseMix;
3502 22 Sep 15 olle 190       frm.rneasyMinEluteSpinColumn.value = startItemList.rneasyMinEluteSpinColumn;
3502 22 Sep 15 olle 191       frm.qiaampMinEluteSpinColumn.value = startItemList.qiaampMinEluteSpinColumn;
3502 22 Sep 15 olle 192
3502 22 Sep 15 olle 193       // Quality control reagents
3502 22 Sep 15 olle 194       frm.kapaSybrFast.value = startItemList.kapaSybrFast;
3502 22 Sep 15 olle 195       frm.qualityControlPrimersQcpRgt.value = startItemList.qualityControlPrimersQcpRgt;
3502 22 Sep 15 olle 196       frm.qualityControlTemplateQct.value = startItemList.qualityControlTemplateQct;
3502 22 Sep 15 olle 197       frm.qubitDnaHighSens.value = startItemList.qubitDnaHighSens;
3502 22 Sep 15 olle 198       frm.qubitDnaBroadRange.value = startItemList.qubitDnaBroadRange;
3502 22 Sep 15 olle 199
3502 22 Sep 15 olle 200       // Disable input fields
3502 22 Sep 15 olle 201
3502 22 Sep 15 olle 202       // Extraction parameters
3502 22 Sep 15 olle 203       frm.startListName.disabled = true;
3502 22 Sep 15 olle 204       frm.isolationDate.disabled = true;
3502 22 Sep 15 olle 205       frm.extractionOperator.disabled = true;
3502 22 Sep 15 olle 206       frm.extractionProtocolName.disabled = true;
3502 22 Sep 15 olle 207
3502 22 Sep 15 olle 208       // Specimen reagents
3502 22 Sep 15 olle 209       frm.xyleneSpecimen.disabled = true;
3502 22 Sep 15 olle 210       frm.etoh995Specimen.disabled = true;
3502 22 Sep 15 olle 211       frm.allPrepFfpeKit.disabled = true;
3502 22 Sep 15 olle 212       frm.bufferPkdSpecimen.disabled = true;
3502 22 Sep 15 olle 213       frm.bufferAtlSpecimen.disabled = true;
3502 22 Sep 15 olle 214       frm.proteinaseKSpecimen.disabled = true;
3502 22 Sep 15 olle 215       frm.rnaseASpecimen.disabled = true;
3502 22 Sep 15 olle 216
3502 22 Sep 15 olle 217       // QIAcube parameters
3502 22 Sep 15 olle 218       frm.qiacubeDate.disabled = true;
3502 22 Sep 15 olle 219       frm.qiacubeOperator.disabled = true;
3502 22 Sep 15 olle 220       frm.qiacubePrimaryPrefix.disabled = true;
3502 22 Sep 15 olle 221       frm.qiacubeSecondaryPrefix.disabled = true;
3502 22 Sep 15 olle 222       frm.qiacubeRunNo.disabled = true;
3502 22 Sep 15 olle 223
3502 22 Sep 15 olle 224       // QIAcube reagents
3502 22 Sep 15 olle 225       frm.etoh995.disabled = true;
3502 22 Sep 15 olle 226       frm.bufferRlt.disabled = true;
3502 22 Sep 15 olle 227       frm.bufferFrn.disabled = true;
3502 22 Sep 15 olle 228       frm.bufferRpe.disabled = true;
3502 22 Sep 15 olle 229       frm.bufferAl.disabled = true;
3502 22 Sep 15 olle 230       frm.bufferAw1.disabled = true;
3502 22 Sep 15 olle 231       frm.bufferAw2.disabled = true;
3502 22 Sep 15 olle 232       frm.bufferAte.disabled = true;
3502 22 Sep 15 olle 233       frm.bufferRdd.disabled = true;
3502 22 Sep 15 olle 234       frm.rnaseFreeWater.disabled = true;
3502 22 Sep 15 olle 235       frm.dnaseMix.disabled = true;
3502 22 Sep 15 olle 236       frm.rneasyMinEluteSpinColumn.disabled = true;
3502 22 Sep 15 olle 237       frm.qiaampMinEluteSpinColumn.disabled = true;
3502 22 Sep 15 olle 238
3502 22 Sep 15 olle 239       // Quality control reagents
3502 22 Sep 15 olle 240       frm.kapaSybrFast.disabled = true;
3502 22 Sep 15 olle 241       frm.qualityControlPrimersQcpRgt.disabled = true;
3502 22 Sep 15 olle 242       frm.qualityControlTemplateQct.disabled = true;
3502 22 Sep 15 olle 243       frm.qubitDnaHighSens.disabled = true;
3502 22 Sep 15 olle 244       frm.qubitDnaBroadRange.disabled = true;
3502 22 Sep 15 olle 245     }
3502 22 Sep 15 olle 246
3502 22 Sep 15 olle 247     var sourceItemList = frm.extractSourceItems;
3502 22 Sep 15 olle 248     if (items.length > 0)
3502 22 Sep 15 olle 249     {
3502 22 Sep 15 olle 250       var numItems = items.length;
3502 22 Sep 15 olle 251       for (var i=0; i < items.length; i++)
3502 22 Sep 15 olle 252       {
3502 22 Sep 15 olle 253         var item = items[i];
3502 22 Sep 15 olle 254         var name = (i+1) + ': ' + Strings.encodeTags(item.name);
3502 22 Sep 15 olle 255         if (item.bioWell)
3502 22 Sep 15 olle 256         {
3502 22 Sep 15 olle 257           name += ' -- ' + Strings.encodeTags(item.bioWell.bioPlate.name + ' (' + item.bioWell.location+')');
3502 22 Sep 15 olle 258         }
3502 22 Sep 15 olle 259         var selected = true;
3502 22 Sep 15 olle 260         // Identification of item via id works here as specimens and extracts
3502 22 Sep 15 olle 261         // are stored in the same database table using discriminators, and are
3502 22 Sep 15 olle 262         // therefore guaranteed to not have the same id value as another item in the table.
3502 22 Sep 15 olle 263         var option = new Option(name, item.id, selected, selected);
3502 22 Sep 15 olle 264         option.item = item;
3502 22 Sep 15 olle 265         sourceItemList.options[sourceItemList.length] = option;
3502 22 Sep 15 olle 266       }
3502 22 Sep 15 olle 267     }
3502 22 Sep 15 olle 268     else
3502 22 Sep 15 olle 269     {
3502 22 Sep 15 olle 270       Wizard.setFatalError('No items available for processing.');
3502 22 Sep 15 olle 271       return;
3502 22 Sep 15 olle 272     }
3502 22 Sep 15 olle 273   }
3502 22 Sep 15 olle 274
3502 22 Sep 15 olle 275   exreg.qiacubeDateOnChange = function()
3502 22 Sep 15 olle 276   {
3502 22 Sep 15 olle 277     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 278     
3502 22 Sep 15 olle 279     var isolationDateIsValid = Wizard.isValid('isolationDate');
3502 22 Sep 15 olle 280     var qiacubeDateIsValid = Wizard.isValid('qiacubeDate');
3502 22 Sep 15 olle 281     
3502 22 Sep 15 olle 282     if (!isolationDateIsValid || !qiacubeDateIsValid) return;
3502 22 Sep 15 olle 283
3502 22 Sep 15 olle 284     var isolationDate = Dates.parseString(frm.isolationDate.value, 'yyyyMMdd');
3502 22 Sep 15 olle 285     var qiacubeDate = Dates.parseString(frm.qiacubeDate.value, 'yyyyMMdd');
3502 22 Sep 15 olle 286     if (isolationDate > qiacubeDate)
3502 22 Sep 15 olle 287     {
3502 22 Sep 15 olle 288       Wizard.setInputStatus('qiacubeDate', 'invalid', 'QIAcube date is before isolation date');
3502 22 Sep 15 olle 289       qiacubeDateIsAfterIsolationDate = false;
3502 22 Sep 15 olle 290       return;
3502 22 Sep 15 olle 291     }
3502 22 Sep 15 olle 292
3502 22 Sep 15 olle 293     qiacubeDateIsAfterIsolationDate = true;
3502 22 Sep 15 olle 294     
3502 22 Sep 15 olle 295     Wizard.setInputStatus('qiacubeDate', 'valid');
3502 22 Sep 15 olle 296     var url = '../Extraction.servlet?ID='+App.getSessionId();
3502 22 Sep 15 olle 297     url += '&cmd=GetNextQiacubeRunNo&qiacubeDate='+encodeURIComponent(frm.qiacubeDate.value);
3502 22 Sep 15 olle 298     Wizard.showLoadingAnimation('Loading Qiacube run number...');
3502 22 Sep 15 olle 299     Wizard.asyncJsonRequest(url, exreg.gotNextRunNumber);
3502 22 Sep 15 olle 300   }
3502 22 Sep 15 olle 301
3502 22 Sep 15 olle 302   exreg.gotNextRunNumber = function(response)
3502 22 Sep 15 olle 303   {
3502 22 Sep 15 olle 304     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 305     frm.qiacubeRunNo.value = response.nextQiacubeRunNo;
3502 22 Sep 15 olle 306     Events.sendChangeEvent('qiacubeRunNo');
3502 22 Sep 15 olle 307   }
3502 22 Sep 15 olle 308
3502 22 Sep 15 olle 309   exreg.qiacubeRunNoOnChange = function()
3502 22 Sep 15 olle 310   {
3502 22 Sep 15 olle 311     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 312     var runNumber = frm.qiacubeRunNo.value;
3502 22 Sep 15 olle 313     qiacubeRunNoIsValid = false;
3502 22 Sep 15 olle 314
3502 22 Sep 15 olle 315     if (runNumber == '')
3502 22 Sep 15 olle 316     {
3502 22 Sep 15 olle 317       Wizard.setInputStatus('qiacubeRunNo', 'invalid', 'Missing');
3502 22 Sep 15 olle 318       return;
3502 22 Sep 15 olle 319     }
3502 22 Sep 15 olle 320     if (!(parseInt(runNumber, 10) >= 1))
3502 22 Sep 15 olle 321     {
3502 22 Sep 15 olle 322       Wizard.setInputStatus('qiacubeRunNo', 'invalid', 'Must be at least 1');
3502 22 Sep 15 olle 323       return;    
3502 22 Sep 15 olle 324     }
3502 22 Sep 15 olle 325     
3502 22 Sep 15 olle 326     Wizard.setInputStatus('qiacubeRunNo', 'valid');
3502 22 Sep 15 olle 327     qiacubeRunNoIsValid = true;
3502 22 Sep 15 olle 328   }
3502 22 Sep 15 olle 329
3502 22 Sep 15 olle 330   exreg.validateStep2 = function(event)
3502 22 Sep 15 olle 331   {
3502 22 Sep 15 olle 332     var valid = true;
3502 22 Sep 15 olle 333     valid &= Wizard.isValid('isolationDate');
3502 22 Sep 15 olle 334     valid &= Wizard.isValid('qiacubeDate');
3502 22 Sep 15 olle 335     valid &= qiacubeRunNoIsValid;
3502 22 Sep 15 olle 336     
3502 22 Sep 15 olle 337     if (!valid) event.preventDefault();
3502 22 Sep 15 olle 338   }
3502 22 Sep 15 olle 339
3502 22 Sep 15 olle 340   exreg.initializeStep3 = function()
3502 22 Sep 15 olle 341   {
3502 22 Sep 15 olle 342     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 343     var startItemList = null;
3502 22 Sep 15 olle 344     for (var i = 0; i < frm.startList.length; i++)
3502 22 Sep 15 olle 345     {
3502 22 Sep 15 olle 346       if (frm.startList[i].selected)
3502 22 Sep 15 olle 347       {
3502 22 Sep 15 olle 348         startItemList = frm.startList[i];
3502 22 Sep 15 olle 349       }
3502 22 Sep 15 olle 350     }
3502 22 Sep 15 olle 351     if (startItemList == null)
3502 22 Sep 15 olle 352     {
3502 22 Sep 15 olle 353       event.preventDefault();
3502 22 Sep 15 olle 354     }
3502 22 Sep 15 olle 355     var startListName = frm.startListName.value;
3502 22 Sep 15 olle 356     Doc.element('detailsStartListName').innerHTML = '<b>Start list: ' + startListName + '</b>';
3502 22 Sep 15 olle 357     qiacubeSortedPrefixes = exreg.getQiacubeSortedPrefixes();
3502 22 Sep 15 olle 358     
3502 22 Sep 15 olle 359     var html = '<table id="detailsTable" class="step-form">';
3502 22 Sep 15 olle 360     // First header row
3502 22 Sep 15 olle 361     html += '<thead>';
3502 22 Sep 15 olle 362     html += '<tr>';
3502 22 Sep 15 olle 363     html += '<th>Extract</th>';
3502 22 Sep 15 olle 364     html += '<th class="dottedleft">QIAcube</th>';
3502 22 Sep 15 olle 365     html += '<th colspan="1" class="dottedleft"></th>';
3502 22 Sep 15 olle 366     html += '<th colspan="1" class="dottedleft">NanoDrop</th>';
3502 22 Sep 15 olle 367     html += '<th colspan="1" class="dottedleft">RNA</th>';
3502 22 Sep 15 olle 368     html += '<th colspan="1" class="dottedleft">DNA</th>';
3502 22 Sep 15 olle 369     html += '<th class="dottedleft comment">Comment</th>';
3502 22 Sep 15 olle 370     html += '<th></th>';
3502 22 Sep 15 olle 371     html += '</tr>';
3502 22 Sep 15 olle 372     // Second header row
3502 22 Sep 15 olle 373     html += '<tr>';
3502 22 Sep 15 olle 374     html += '<th>source item</th>';
3502 22 Sep 15 olle 375     html += '<th class="dottedleft">position</th>';
3502 22 Sep 15 olle 376     html += '<td class="dottedleft">Storage</td>';
3502 22 Sep 15 olle 377     html += '<th class="dottedleft">Plate Pos.</th>';
3502 22 Sep 15 olle 378     html += '<th class="dottedleft">Plate Pos.</th>';
3502 22 Sep 15 olle 379     html += '<th class="dottedleft">Plate Pos.</th>';
3502 22 Sep 15 olle 380     html += '<td class="dottedleft comment"></td>';
3502 22 Sep 15 olle 381     html += '<td></td>';
3502 22 Sep 15 olle 382     html += '</tr>';
3502 22 Sep 15 olle 383     // Third header row
3502 22 Sep 15 olle 384     html += '<tr>';
3502 22 Sep 15 olle 385     html += '<th></th>';
3502 22 Sep 15 olle 386     html += '<th class="dottedleft"></th>';
3502 22 Sep 15 olle 387     html += '<td class="dottedleft">box</td>';
3502 22 Sep 15 olle 388     html += '<td class="dottedleft"></td>';
3502 22 Sep 15 olle 389     html += '<td class="dottedleft"></td>';
3502 22 Sep 15 olle 390     html += '<td class="dottedleft"></td>';
3502 22 Sep 15 olle 391     html += '<td class="dottedleft comment"></td>';
3502 22 Sep 15 olle 392     html += '<td></td>';
3502 22 Sep 15 olle 393     html += '</tr>';
3502 22 Sep 15 olle 394     html += '</thead>';
3502 22 Sep 15 olle 395     html += '<tbody>';
3502 22 Sep 15 olle 396
3502 22 Sep 15 olle 397     // Get list of selected extract source items
3502 22 Sep 15 olle 398     var selItemsList = exreg.getSelectedItemsList();
3502 22 Sep 15 olle 399     var numItems = selItemsList.length;
3502 22 Sep 15 olle 400     var numSpecimenItems = exreg.getNumberOfSpecimenItems();
3502 22 Sep 15 olle 401     var numRnaItems = exreg.getNumberOfRnaItems();
3502 22 Sep 15 olle 402     var numDnaItems = exreg.getNumberOfDnaItems();
3502 22 Sep 15 olle 403     var numNanoDropItems = numSpecimenItems + numRnaItems;
3502 22 Sep 15 olle 404     var numQiacubeItems = numSpecimenItems;
3502 22 Sep 15 olle 405     var totNumItems = numItems;
3502 22 Sep 15 olle 406     var itemNo = 0;
3502 22 Sep 15 olle 407     var qiacubeItemNo = 0;
3502 22 Sep 15 olle 408     // Set default values for DNA/RNA extraction
3502 22 Sep 15 olle 409     for (var i = 0; i < totNumItems; i++)
3502 22 Sep 15 olle 410     {
3502 22 Sep 15 olle 411       itemNo++;
3502 22 Sep 15 olle 412       var item = null;
3502 22 Sep 15 olle 413       var storageBox = '-';
3502 22 Sep 15 olle 414       var rnaStorageBox = '-';
3502 22 Sep 15 olle 415       var dnaStorageBox = '-';
3502 22 Sep 15 olle 416       item = selItemsList[i];
3502 22 Sep 15 olle 417       var qiacubePos = null;
3502 22 Sep 15 olle 418       if (ExtractUtils.isSpecimen(item))
3502 22 Sep 15 olle 419       {
3502 22 Sep 15 olle 420         qiacubeItemNo++;
3502 22 Sep 15 olle 421         qiacubePos = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems, qiacubeItemNo, qiacubeSortedPrefixes);
3502 22 Sep 15 olle 422       }
3502 22 Sep 15 olle 423       item.qiacubePosition = qiacubePos;
3502 22 Sep 15 olle 424       item.originalQiacubePosition = qiacubePos;
3502 22 Sep 15 olle 425         
3502 22 Sep 15 olle 426       var rna = {};
3502 22 Sep 15 olle 427       var dna = {};
3502 22 Sep 15 olle 428       // RNA
3502 22 Sep 15 olle 429       rna.name = item.name + '.r';
3502 22 Sep 15 olle 430       // DNA
3502 22 Sep 15 olle 431       dna.name = item.name + '.d';
3502 22 Sep 15 olle 432       if (!item.rna)
3502 22 Sep 15 olle 433       {
3502 22 Sep 15 olle 434         item.rna = rna;
3502 22 Sep 15 olle 435       }
3502 22 Sep 15 olle 436       if (!item.dna)
3502 22 Sep 15 olle 437       {
3502 22 Sep 15 olle 438         item.dna = dna;
3502 22 Sep 15 olle 439       }
3502 22 Sep 15 olle 440
3502 22 Sep 15 olle 441       // Input extract source item specimen/RNA/DNA
3502 22 Sep 15 olle 442       if (item.bioWell != null)
3502 22 Sep 15 olle 443       {
3502 22 Sep 15 olle 444         storageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3502 22 Sep 15 olle 445       }
3502 22 Sep 15 olle 446       // RNA extract from specimen
3502 22 Sep 15 olle 447       if (item.rna && item.rna.bioWell)
3502 22 Sep 15 olle 448       {
3502 22 Sep 15 olle 449         rnaStorageBox = Strings.encodeTags(item.rna.bioWell.bioPlate.name + '[' + item.rna.bioWell.location + ']');
3502 22 Sep 15 olle 450       }
3502 22 Sep 15 olle 451       // DNA extract from specimen
3502 22 Sep 15 olle 452       if (item.dna && item.dna.bioWell)
3502 22 Sep 15 olle 453       {
3502 22 Sep 15 olle 454         dnaStorageBox = Strings.encodeTags(item.dna.bioWell.bioPlate.name + '[' + item.dna.bioWell.location + ']');
3502 22 Sep 15 olle 455       }
3502 22 Sep 15 olle 456       // Input RNA item storage location should be displayed in the RNA extract storage location column
3502 22 Sep 15 olle 457       if (ExtractUtils.isRna(item) && item.bioWell != null)
3502 22 Sep 15 olle 458       {
3502 22 Sep 15 olle 459         rnaStorageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3502 22 Sep 15 olle 460       }
3502 22 Sep 15 olle 461       // Input DNA item storage location should be displayed in the DNA extract storage location column
3502 22 Sep 15 olle 462       if (ExtractUtils.isDna(item) && item.bioWell != null)
3502 22 Sep 15 olle 463       {
3502 22 Sep 15 olle 464         dnaStorageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3502 22 Sep 15 olle 465       }
3502 22 Sep 15 olle 466       html += '<tr class="highlight">';
3502 22 Sep 15 olle 467       html += '<th>' + Strings.encodeTags(item.name) + '</th>';
3502 22 Sep 15 olle 468       html += '<td id="qiacubePosition'+i+'" class="dottedleft"></td>';
3502 22 Sep 15 olle 469       html += '<td class="dottedleft">'+storageBox+'</td>';
3502 22 Sep 15 olle 470       html += '<td id="rnaPos'+i+'" class="dottedleft"></td>';
3502 22 Sep 15 olle 471       html += '<td id="rnaPlatePos'+i+'" class="dottedleft">'+rnaStorageBox+'</td>';
3502 22 Sep 15 olle 472       html += '<td id="dnaPlatePos'+i+'" class="dottedleft">'+dnaStorageBox+'</td>';
3502 22 Sep 15 olle 473       html += '<td id="comments'+i+'" class="dottedleft comment"></td>';
3502 22 Sep 15 olle 474       html += '</tr>';
3502 22 Sep 15 olle 475     }
3502 22 Sep 15 olle 476     if (numQiacubeItems == 1 || numQiacubeItems == 11 || numQiacubeItems == 23)
3502 22 Sep 15 olle 477     {
3502 22 Sep 15 olle 478       // Add extra row for counterbalance in QIAcube
3502 22 Sep 15 olle 479       counterBalanceInfoRow = true;
3502 22 Sep 15 olle 480       var i = numItems;
3502 22 Sep 15 olle 481       var qiacubePos = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems + 1, numQiacubeItems + 1, qiacubeSortedPrefixes);
3502 22 Sep 15 olle 482         
3502 22 Sep 15 olle 483       html += '<tr class="highlight">';
3502 22 Sep 15 olle 484       html += '<th>' + Strings.encodeTags('COUNTER-BALANCE') + '</th>';
3502 22 Sep 15 olle 485       html += '<td id="qiacubePosition'+i+'" class="dottedleft">'+qiacubePos+'</td>';
3502 22 Sep 15 olle 486       html += '<td class="dottedleft">-</td>';
3502 22 Sep 15 olle 487       html += '<td id="rnaPos'+i+'" class="dottedleft">-</td>';
3502 22 Sep 15 olle 488       html += '<td id="rnaPlatePos'+i+'" class="dottedleft">-</td>';
3502 22 Sep 15 olle 489       html += '<td id="dnaPlatePos'+i+'" class="dottedleft">-</td>';
3502 22 Sep 15 olle 490       html += '<td id="comments'+i+'" class="dottedleft comment">Reminder to use counterbalance</td>';
3502 22 Sep 15 olle 491       html += '</tr>';        
3502 22 Sep 15 olle 492     }
3502 22 Sep 15 olle 493     html += '</tbody>';
3502 22 Sep 15 olle 494     html += '</table>';
3502 22 Sep 15 olle 495     Doc.element('detailsSection').innerHTML = html;
3502 22 Sep 15 olle 496
3502 22 Sep 15 olle 497     Wizard.setCurrentStep(3);
3502 22 Sep 15 olle 498
3502 22 Sep 15 olle 499     Doc.hide('sampleIdFilesSection');
3502 22 Sep 15 olle 500
3502 22 Sep 15 olle 501     var url = '../Extraction.servlet?ID='+App.getSessionId();
3502 22 Sep 15 olle 502     url += '&cmd=GetSourceItemListFromStartItemList';
3502 22 Sep 15 olle 503     url += '&startItemListId='+startItemList.value;
3502 22 Sep 15 olle 504     url += '&includeSpecimenExtracts=true';
3502 22 Sep 15 olle 505     Wizard.asyncJsonRequest(url, exreg.initializeStep3b);
3502 22 Sep 15 olle 506   }
3502 22 Sep 15 olle 507     
3502 22 Sep 15 olle 508   exreg.initializeStep3b = function(response)
3502 22 Sep 15 olle 509   {
3502 22 Sep 15 olle 510     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 511     var numQiacubeItems = exreg.getNumberOfSpecimenItems();
3502 22 Sep 15 olle 512     qiacubeSortedPrefixes = exreg.getQiacubeSortedPrefixes();
3502 22 Sep 15 olle 513     var qiacubeItemNo = 0;
3502 22 Sep 15 olle 514
3502 22 Sep 15 olle 515     var itemNameNanoDropPosJson = exreg.createItemNameNanoDropPosJson();
3502 22 Sep 15 olle 516
3502 22 Sep 15 olle 517     // Re-load source item list, as items now have more info attached
3502 22 Sep 15 olle 518     var items = response.items;
3502 22 Sep 15 olle 519     var sourceItemList = frm.extractSourceItems;
3502 22 Sep 15 olle 520     if (items.length > 0)
3502 22 Sep 15 olle 521     {
3502 22 Sep 15 olle 522       var numItems = items.length;
3502 22 Sep 15 olle 523       for (var i=0; i < items.length; i++)
3502 22 Sep 15 olle 524       {
3502 22 Sep 15 olle 525         var item = items[i];
3502 22 Sep 15 olle 526         if (!item.rna)
3502 22 Sep 15 olle 527         {
3502 22 Sep 15 olle 528           var rna = {};
3502 22 Sep 15 olle 529           // RNA
3502 22 Sep 15 olle 530           rna.name = item.name + '.r';
3502 22 Sep 15 olle 531           rna.well = null;
3502 22 Sep 15 olle 532           item.rna = rna;
3502 22 Sep 15 olle 533         }
3502 22 Sep 15 olle 534         if (!item.dna)
3502 22 Sep 15 olle 535         {
3502 22 Sep 15 olle 536           var dna = {};
3502 22 Sep 15 olle 537           // DNA
3502 22 Sep 15 olle 538           dna.name = item.name + '.d';
3502 22 Sep 15 olle 539           item.dna = dna;
3502 22 Sep 15 olle 540         }
3502 22 Sep 15 olle 541         // Set RNA well
3502 22 Sep 15 olle 542         item.rna.nanoDropWell = null;
3502 22 Sep 15 olle 543         if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3502 22 Sep 15 olle 544         {
3502 22 Sep 15 olle 545           var nanoDropPos = itemNameNanoDropPosJson[item.name];
3502 22 Sep 15 olle 546           if (nanoDropPos)
3502 22 Sep 15 olle 547           {
3502 22 Sep 15 olle 548             item.rna.nanoDropWell = nanoDropPos;
3502 22 Sep 15 olle 549           }
3502 22 Sep 15 olle 550         }
3502 22 Sep 15 olle 551         var selected = true;
3502 22 Sep 15 olle 552         // Identification of item via id works here as specimens and extracts
3502 22 Sep 15 olle 553         // are stored in the same database table using discriminators, and are
3502 22 Sep 15 olle 554         // therefore guaranteed to not have the same id value as another item in the table.
3502 22 Sep 15 olle 555         var option = new Option(name, item.id, selected, selected);
3502 22 Sep 15 olle 556         option.item = item;
3502 22 Sep 15 olle 557         sourceItemList.options[i] = option;
3502 22 Sep 15 olle 558       }
3502 22 Sep 15 olle 559     }
3502 22 Sep 15 olle 560     else
3502 22 Sep 15 olle 561     {
3502 22 Sep 15 olle 562       Wizard.setFatalError('No items available for processing.');
3502 22 Sep 15 olle 563       return;
3502 22 Sep 15 olle 564     }
3502 22 Sep 15 olle 565     
3502 22 Sep 15 olle 566     exreg.updateDetailsTable();
3502 22 Sep 15 olle 567     
3502 22 Sep 15 olle 568     Wizard.setCurrentStep(3);
3502 22 Sep 15 olle 569
3502 22 Sep 15 olle 570     Doc.show('gocancel');
3502 22 Sep 15 olle 571     Doc.show('goregister');
3502 22 Sep 15 olle 572     Wizard.showGoNextConfirmation(true, 'Check to verify removal of start list.');
3502 22 Sep 15 olle 573     
3502 22 Sep 15 olle 574     Wizard.keepSessionAlive();
3502 22 Sep 15 olle 575   }
3502 22 Sep 15 olle 576
3502 22 Sep 15 olle 577   exreg.submit = function()
3502 22 Sep 15 olle 578   {
3502 22 Sep 15 olle 579     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 580     
3502 22 Sep 15 olle 581     var submitInfo = {};
3502 22 Sep 15 olle 582     submitInfo.items = [];
3502 22 Sep 15 olle 583     submitInfo.extraItems = [];
3502 22 Sep 15 olle 584
3502 22 Sep 15 olle 585     var startItemList = null;
3502 22 Sep 15 olle 586     for (var i = 0; i < frm.startList.length; i++)
3502 22 Sep 15 olle 587     {
3502 22 Sep 15 olle 588       if (frm.startList[i].selected)
3502 22 Sep 15 olle 589       {
3502 22 Sep 15 olle 590         startItemList = frm.startList[i];
3502 22 Sep 15 olle 591       }
3502 22 Sep 15 olle 592     }
3502 22 Sep 15 olle 593
3502 22 Sep 15 olle 594     // Get list of selected extract source items
3502 22 Sep 15 olle 595     var selItemsList = exreg.getSelectedItemsList();
3502 22 Sep 15 olle 596     var numItems = selItemsList.length;
3502 22 Sep 15 olle 597     var totNumItems = numItems;
3502 22 Sep 15 olle 598     for (var i = 0; i < totNumItems; i++)
3502 22 Sep 15 olle 599     {
3502 22 Sep 15 olle 600       var item = null;
3502 22 Sep 15 olle 601       if (i < numItems)
3502 22 Sep 15 olle 602       {
3502 22 Sep 15 olle 603         item = selItemsList[i];
3502 22 Sep 15 olle 604         submitInfo.items[submitInfo.items.length] = item;
3502 22 Sep 15 olle 605       }
3502 22 Sep 15 olle 606     }
3502 22 Sep 15 olle 607     
3502 22 Sep 15 olle 608     // Extraction
3502 22 Sep 15 olle 609     submitInfo.startListName = frm.startListName.value;
3502 22 Sep 15 olle 610     submitInfo.isolationDate = frm.isolationDate.value;
3502 22 Sep 15 olle 611     submitInfo.extractionOperator = frm.extractionOperator.value;
3502 22 Sep 15 olle 612
3502 22 Sep 15 olle 613     // QIAcube
3502 22 Sep 15 olle 614     submitInfo.qiacubeDate = frm.qiacubeDate.value;
3502 22 Sep 15 olle 615     submitInfo.qiacubeOperator = frm.qiacubeOperator.value;
3502 22 Sep 15 olle 616     submitInfo.qiacubePrimaryPrefix = frm.qiacubePrimaryPrefix.value;
3502 22 Sep 15 olle 617     submitInfo.qiacubeSecondaryPrefix = frm.qiacubeSecondaryPrefix.value;
3502 22 Sep 15 olle 618     submitInfo.qiacubeRunNo = parseInt(frm.qiacubeRunNo.value, 10);
3502 22 Sep 15 olle 619     submitInfo.allPrepFfpeKit = frm.allPrepFfpeKit.value;
3502 22 Sep 15 olle 620
3502 22 Sep 15 olle 621     var url = '../Extraction.servlet?ID='+App.getSessionId();
3502 22 Sep 15 olle 622     url += '&cmd=RemoveStartItemList';
3502 22 Sep 15 olle 623     url += '&startItemListId='+startItemList.value;
3502 22 Sep 15 olle 624     Wizard.showLoadingAnimation('Performing registration...');
3502 22 Sep 15 olle 625     Wizard.asyncJsonRequest(url, exreg.submissionResults, 'POST', JSON.stringify(submitInfo));
3502 22 Sep 15 olle 626   }
3502 22 Sep 15 olle 627   
3502 22 Sep 15 olle 628   exreg.submissionResults = function(response)
3502 22 Sep 15 olle 629   {
3502 22 Sep 15 olle 630     Wizard.showFinalMessage(response.messages);
3502 22 Sep 15 olle 631     Doc.show('gorestart');
3502 22 Sep 15 olle 632   }
3502 22 Sep 15 olle 633
3502 22 Sep 15 olle 634   exreg.createItemNameNanoDropPosJson = function()
3502 22 Sep 15 olle 635   {
3502 22 Sep 15 olle 636     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 637
3502 22 Sep 15 olle 638     qiacubeSortedPrefixes = exreg.getQiacubeSortedPrefixes();
3502 22 Sep 15 olle 639     // Get list of selected extract source items
3502 22 Sep 15 olle 640     var selItemsList = exreg.getSelectedItemsList();
3502 22 Sep 15 olle 641     var numItems = selItemsList.length;
3502 22 Sep 15 olle 642     var numSpecimenItems = exreg.getNumberOfSpecimenItems();
3502 22 Sep 15 olle 643     var numQiacubeItems = numSpecimenItems;
3502 22 Sep 15 olle 644     var totNumItems = numItems;
3502 22 Sep 15 olle 645     var itemNo = 0;
3502 22 Sep 15 olle 646     qiacubeItemNo = 0;
3502 22 Sep 15 olle 647     var nanoDropItemNo = 0;
3502 22 Sep 15 olle 648     var rnaItemNo = 0;
3502 22 Sep 15 olle 649     var intNanoDropPlatePosition = 0;
3502 22 Sep 15 olle 650     // Store NanoDrop positions as JSON object with item names as keys
3502 22 Sep 15 olle 651     var nanoDropJsonStr = '{';
3502 22 Sep 15 olle 652     for (var i = 0; i < totNumItems; i++)
3502 22 Sep 15 olle 653     {
3502 22 Sep 15 olle 654       itemNo++;
3502 22 Sep 15 olle 655       var item = null;
3502 22 Sep 15 olle 656       var qiacubePos = null;
3502 22 Sep 15 olle 657       item = selItemsList[i];
3502 22 Sep 15 olle 658       if (ExtractUtils.isSpecimen(item))
3502 22 Sep 15 olle 659       {
3502 22 Sep 15 olle 660         qiacubeItemNo++;
3502 22 Sep 15 olle 661         intNanoDropPlatePosition = qiacubeItemNo;
3502 22 Sep 15 olle 662       }
3502 22 Sep 15 olle 663       if (ExtractUtils.isRna(item))
3502 22 Sep 15 olle 664       {
3502 22 Sep 15 olle 665         rnaItemNo++;
3502 22 Sep 15 olle 666         intNanoDropPlatePosition = numSpecimenItems + rnaItemNo;
3502 22 Sep 15 olle 667       }
3502 22 Sep 15 olle 668       
3502 22 Sep 15 olle 669       // Calculate NanoDrop well from Qiacube position
3502 22 Sep 15 olle 670       var row;
3502 22 Sep 15 olle 671       var col;
3502 22 Sep 15 olle 672       // Specimens from up to two QIAcube instruments and input RNA items placed on one NanoDrop plate
3502 22 Sep 15 olle 673       if (intNanoDropPlatePosition > 16)
3502 22 Sep 15 olle 674       {
3502 22 Sep 15 olle 675         // (17 - 24) NanoDrop plate for secondary QIAcube, positions A3 - H3
3502 22 Sep 15 olle 676         row = intNanoDropPlatePosition - 17;
3502 22 Sep 15 olle 677         col = 3;
3502 22 Sep 15 olle 678       }
3502 22 Sep 15 olle 679       else if (intNanoDropPlatePosition > 8)
3502 22 Sep 15 olle 680       {
3502 22 Sep 15 olle 681         // ( 9 - 12) NanoDrop plate for primary QIAcube, positions A2 - D2
3502 22 Sep 15 olle 682         // (13 - 16) NanoDrop plate for secondary QIAcube, positions E2 - H2
3502 22 Sep 15 olle 683         row = intNanoDropPlatePosition - 9;
3502 22 Sep 15 olle 684         col = 2;
3502 22 Sep 15 olle 685       }
3502 22 Sep 15 olle 686       else if (intNanoDropPlatePosition > 0)
3502 22 Sep 15 olle 687       {
3502 22 Sep 15 olle 688         // ( 1 -  8) NanoDrop plate for primary QIAcube, positions A1 - H1
3502 22 Sep 15 olle 689         row = intNanoDropPlatePosition - 1;
3502 22 Sep 15 olle 690         col = 1;
3502 22 Sep 15 olle 691       }
3502 22 Sep 15 olle 692       var nanoDropWell = Meludi.wellToAlpha(row) + col;
3502 22 Sep 15 olle 693       // Store NanoDrop position as JSON object with item name as key
3502 22 Sep 15 olle 694       if (nanoDropItemNo > 0)
3502 22 Sep 15 olle 695       {
3502 22 Sep 15 olle 696         nanoDropJsonStr += ',';
3502 22 Sep 15 olle 697       }
3502 22 Sep 15 olle 698       nanoDropJsonStr += '"' + item.name + '":"' + nanoDropWell + '"';
3502 22 Sep 15 olle 699       nanoDropItemNo++;
3502 22 Sep 15 olle 700     }
3502 22 Sep 15 olle 701     nanoDropJsonStr += '}';
3502 22 Sep 15 olle 702     return nanoDropJsonStr;
3502 22 Sep 15 olle 703   }
3502 22 Sep 15 olle 704
3502 22 Sep 15 olle 705   exreg.getQiacubeSortedPrefixes = function()
3502 22 Sep 15 olle 706   {
3502 22 Sep 15 olle 707     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 708     var primaryQiacubePrefix = frm.qiacubePrimaryPrefix.value;
3502 22 Sep 15 olle 709     var secondaryQiacubePrefix = frm.qiacubeSecondaryPrefix.value;
3502 22 Sep 15 olle 710
3502 22 Sep 15 olle 711     // Get string of current QIAcube prefixes in order
3502 22 Sep 15 olle 712     var sortedPrefixes = ExtractUtils.getQiacubeSortedPrefixes(primaryQiacubePrefix, secondaryQiacubePrefix);
3502 22 Sep 15 olle 713     return sortedPrefixes;
3502 22 Sep 15 olle 714   }
3502 22 Sep 15 olle 715
3502 22 Sep 15 olle 716   exreg.getSelectedItemsList = function()
3502 22 Sep 15 olle 717   {
3502 22 Sep 15 olle 718     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 719
3502 22 Sep 15 olle 720     // Get number of selected extract source items
3502 22 Sep 15 olle 721     var numItems = 0;
3502 22 Sep 15 olle 722     var selItemsList = [];
3502 22 Sep 15 olle 723     for (var i = 0; i < frm.extractSourceItems.length; i++)
3502 22 Sep 15 olle 724     {
3502 22 Sep 15 olle 725       if (frm.extractSourceItems[i].selected)
3502 22 Sep 15 olle 726       {
3502 22 Sep 15 olle 727         if (frm.extractSourceItems[i].item != null)
3502 22 Sep 15 olle 728         {
3502 22 Sep 15 olle 729           selItemsList[numItems] = frm.extractSourceItems[i].item;
3502 22 Sep 15 olle 730           numItems++;
3502 22 Sep 15 olle 731         }
3502 22 Sep 15 olle 732       }
3502 22 Sep 15 olle 733     }
3502 22 Sep 15 olle 734     return selItemsList;
3502 22 Sep 15 olle 735   }
3502 22 Sep 15 olle 736
3502 22 Sep 15 olle 737   exreg.getNumberOfSpecimenItems = function()
3502 22 Sep 15 olle 738   {
3502 22 Sep 15 olle 739     // Get list of selected extract source items
3502 22 Sep 15 olle 740     var selItemsList = exreg.getSelectedItemsList();
3502 22 Sep 15 olle 741     var numItems = selItemsList.length;
3502 22 Sep 15 olle 742     var numSpecimen = 0;
3502 22 Sep 15 olle 743     for (var i = 0; i < numItems; i++)
3502 22 Sep 15 olle 744     {
3502 22 Sep 15 olle 745       var item = selItemsList[i];
3502 22 Sep 15 olle 746       if (ExtractUtils.isSpecimen(item))
3502 22 Sep 15 olle 747       {
3502 22 Sep 15 olle 748         numSpecimen++;
3502 22 Sep 15 olle 749       }
3502 22 Sep 15 olle 750     }
3502 22 Sep 15 olle 751     return numSpecimen;
3502 22 Sep 15 olle 752   }
3502 22 Sep 15 olle 753   
3502 22 Sep 15 olle 754   exreg.getNumberOfRnaItems = function()
3502 22 Sep 15 olle 755   {
3502 22 Sep 15 olle 756     // Get list of selected extract source items
3502 22 Sep 15 olle 757     var selItemsList = exreg.getSelectedItemsList();
3502 22 Sep 15 olle 758     var numItems = selItemsList.length;
3502 22 Sep 15 olle 759     var numRna = 0;
3502 22 Sep 15 olle 760     for (var i = 0; i < numItems; i++)
3502 22 Sep 15 olle 761     {
3502 22 Sep 15 olle 762       var item = selItemsList[i];
3502 22 Sep 15 olle 763       if (ExtractUtils.isRna(item))
3502 22 Sep 15 olle 764       {
3502 22 Sep 15 olle 765         numRna++;
3502 22 Sep 15 olle 766       }
3502 22 Sep 15 olle 767     }
3502 22 Sep 15 olle 768     return numRna;
3502 22 Sep 15 olle 769   }
3502 22 Sep 15 olle 770   
3502 22 Sep 15 olle 771   exreg.getNumberOfDnaItems = function()
3502 22 Sep 15 olle 772   {
3502 22 Sep 15 olle 773     // Get list of selected extract source items
3502 22 Sep 15 olle 774     var selItemsList = exreg.getSelectedItemsList();
3502 22 Sep 15 olle 775     var numItems = selItemsList.length;
3502 22 Sep 15 olle 776     var numDna = 0;
3502 22 Sep 15 olle 777     for (var i = 0; i < numItems; i++)
3502 22 Sep 15 olle 778     {
3502 22 Sep 15 olle 779       var item = selItemsList[i];
3502 22 Sep 15 olle 780       if (ExtractUtils.isDna(item))
3502 22 Sep 15 olle 781       {
3502 22 Sep 15 olle 782         numDna++;
3502 22 Sep 15 olle 783       }
3502 22 Sep 15 olle 784     }
3502 22 Sep 15 olle 785     return numDna;
3502 22 Sep 15 olle 786   }
3502 22 Sep 15 olle 787
3502 22 Sep 15 olle 788   exreg.updateDetailsTable = function()
3502 22 Sep 15 olle 789   {
3502 22 Sep 15 olle 790     var frm = document.forms['meludi'];
3502 22 Sep 15 olle 791     var hasQiacubePosition = [];
3502 22 Sep 15 olle 792     var duplicatePosition = 0;
3502 22 Sep 15 olle 793
3502 22 Sep 15 olle 794     qiacubeSortedPrefixes = exreg.getQiacubeSortedPrefixes();
3502 22 Sep 15 olle 795     // Get list of selected extract source items
3502 22 Sep 15 olle 796     var selItemsList = exreg.getSelectedItemsList();
3502 22 Sep 15 olle 797     var numItems = selItemsList.length;
3502 22 Sep 15 olle 798     var numSpecimenItems = exreg.getNumberOfSpecimenItems();
3502 22 Sep 15 olle 799     var numRnaItems = exreg.getNumberOfRnaItems();
3502 22 Sep 15 olle 800     var numDnaItems = exreg.getNumberOfDnaItems();
3502 22 Sep 15 olle 801     var numNanoDropItems = numSpecimenItems + numRnaItems;
3502 22 Sep 15 olle 802     var numQiacubeItems = numSpecimenItems;
3502 22 Sep 15 olle 803     var totNumItems = numItems;
3502 22 Sep 15 olle 804     // Get sorted list of used integer QIAcube positions for specimens, generalized for more than one QIAcube
3502 22 Sep 15 olle 805     var specSortedIntQiacubePosition = [];
3502 22 Sep 15 olle 806     var qiacubeItemNo = 0;
3502 22 Sep 15 olle 807     for (var i = 0; i < totNumItems; i++)
3502 22 Sep 15 olle 808     {
3502 22 Sep 15 olle 809       var item = selItemsList[i];
3502 22 Sep 15 olle 810       if (ExtractUtils.isSpecimen(item))
3502 22 Sep 15 olle 811       {
3502 22 Sep 15 olle 812         var qiacubePos = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems, qiacubeItemNo + 1, qiacubeSortedPrefixes);
3502 22 Sep 15 olle 813         item.qiacubePosition = qiacubePos;
3502 22 Sep 15 olle 814         var intQiacubePosition = ExtractUtils.getIntQiacubePosition(item.qiacubePosition, qiacubeSortedPrefixes);
3502 22 Sep 15 olle 815         specSortedIntQiacubePosition[qiacubeItemNo] = intQiacubePosition;
3502 22 Sep 15 olle 816         qiacubeItemNo++;
3502 22 Sep 15 olle 817       }
3502 22 Sep 15 olle 818     }
3502 22 Sep 15 olle 819     // Sort for ascending integer values
3502 22 Sep 15 olle 820     specSortedIntQiacubePosition.sort(function(a,b){return a-b});
3502 22 Sep 15 olle 821     var rnaItemNo = 0;
3502 22 Sep 15 olle 822     var qiacubeItemNo = 0;
3502 22 Sep 15 olle 823     // Set default values for DNA/RNA extraction
3502 22 Sep 15 olle 824     for (var i = 0; i < totNumItems; i++)
3502 22 Sep 15 olle 825     {
3502 22 Sep 15 olle 826       var rnaStorageBox = '-';
3502 22 Sep 15 olle 827       var dnaStorageBox = '-';
3502 22 Sep 15 olle 828       var item = null;
3502 22 Sep 15 olle 829       item = selItemsList[i];
3502 22 Sep 15 olle 830       var qiacubePos = null;
3502 22 Sep 15 olle 831       if (ExtractUtils.isSpecimen(item))
3502 22 Sep 15 olle 832       {
3502 22 Sep 15 olle 833         qiacubeItemNo++;
3502 22 Sep 15 olle 834         qiacubePos = ExtractUtils.getDetailedQiaCubePosition(numQiacubeItems, qiacubeItemNo, qiacubeSortedPrefixes);
3502 22 Sep 15 olle 835         item.qiacubePosition = qiacubePos;
3502 22 Sep 15 olle 836       }
3502 22 Sep 15 olle 837       item.originalQiacubePosition = qiacubePos;
3502 22 Sep 15 olle 838
3502 22 Sep 15 olle 839       // RNA extract from specimen
3502 22 Sep 15 olle 840       if (item.rna && item.rna.bioWell)
3502 22 Sep 15 olle 841       {
3502 22 Sep 15 olle 842         rnaStorageBox = Strings.encodeTags(item.rna.bioWell.bioPlate.name + '[' + item.rna.bioWell.location + ']');
3502 22 Sep 15 olle 843       }
3502 22 Sep 15 olle 844       // DNA extract from specimen
3502 22 Sep 15 olle 845       if (item.dna && item.dna.bioWell)
3502 22 Sep 15 olle 846       {
3502 22 Sep 15 olle 847         dnaStorageBox = Strings.encodeTags(item.dna.bioWell.bioPlate.name + '[' + item.dna.bioWell.location + ']');
3502 22 Sep 15 olle 848       }
3502 22 Sep 15 olle 849       // Input RNA item storage location should be displayed in the RNA extract storage location column
3502 22 Sep 15 olle 850       if (ExtractUtils.isRna(item) && item.bioWell != null)
3502 22 Sep 15 olle 851       {
3502 22 Sep 15 olle 852         rnaStorageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3502 22 Sep 15 olle 853       }
3502 22 Sep 15 olle 854       // Input DNA item storage location should be displayed in the DNA extract storage location column
3502 22 Sep 15 olle 855       if (ExtractUtils.isDna(item) && item.bioWell != null)
3502 22 Sep 15 olle 856       {
3502 22 Sep 15 olle 857         dnaStorageBox = Strings.encodeTags(item.bioWell.bioPlate.name + '[' + item.bioWell.location + ']');
3502 22 Sep 15 olle 858       }
3502 22 Sep 15 olle 859       if (Doc.element('qiacubePosition'+i))
3502 22 Sep 15 olle 860       {
3502 22 Sep 15 olle 861         Doc.element('qiacubePosition'+i).innerHTML = item.qiacubePosition;
3502 22 Sep 15 olle 862         Doc.addOrRemoveClass('qiacubePosition'+i, 'nondefault', item.qiacubePosition != item.originalQiacubePosition);
3502 22 Sep 15 olle 863       }
3502 22 Sep 15 olle 864
3502 22 Sep 15 olle 865       var intQiacubePosition = ExtractUtils.getIntQiacubePosition(item.qiacubePosition, qiacubeSortedPrefixes);      
3502 22 Sep 15 olle 866       if (intQiacubePosition != null)
3502 22 Sep 15 olle 867       {
3502 22 Sep 15 olle 868         if (hasQiacubePosition[intQiacubePosition])
3502 22 Sep 15 olle 869         {
3502 22 Sep 15 olle 870           duplicatePosition = intQiacubePosition;
3502 22 Sep 15 olle 871         }
3502 22 Sep 15 olle 872         else
3502 22 Sep 15 olle 873         {
3502 22 Sep 15 olle 874           hasQiacubePosition[intQiacubePosition] = true;
3502 22 Sep 15 olle 875         }
3502 22 Sep 15 olle 876       }
3502 22 Sep 15 olle 877       var intNanoDropPlatePosition = intQiacubePosition;
3502 22 Sep 15 olle 878       // Get integer NanoDrop position for specimens from index in sorted list of used integer QIAcube positions
3502 22 Sep 15 olle 879       if (intQiacubePosition)
3502 22 Sep 15 olle 880       {
3502 22 Sep 15 olle 881         var sortIndex = -1;
3502 22 Sep 15 olle 882         for (var j = 0; j < specSortedIntQiacubePosition.length; j++)
3502 22 Sep 15 olle 883         {
3502 22 Sep 15 olle 884           if (intQiacubePosition == specSortedIntQiacubePosition[j])
3502 22 Sep 15 olle 885           {
3502 22 Sep 15 olle 886             sortIndex = j;
3502 22 Sep 15 olle 887           }
3502 22 Sep 15 olle 888         }
3502 22 Sep 15 olle 889         if (sortIndex > -1)
3502 22 Sep 15 olle 890         {
3502 22 Sep 15 olle 891           intNanoDropPlatePosition = sortIndex + 1;
3502 22 Sep 15 olle 892         }
3502 22 Sep 15 olle 893       }
3502 22 Sep 15 olle 894       if (ExtractUtils.isRna(item))
3502 22 Sep 15 olle 895       {
3502 22 Sep 15 olle 896         rnaItemNo++;
3502 22 Sep 15 olle 897         intNanoDropPlatePosition = numSpecimenItems + rnaItemNo;
3502 22 Sep 15 olle 898       }
3502 22 Sep 15 olle 899       
3502 22 Sep 15 olle 900       // Calculate NanoDrop well from Qiacube position
3502 22 Sep 15 olle 901       var row;
3502 22 Sep 15 olle 902       var col;
3502 22 Sep 15 olle 903       // Specimens from up to two QIAcube instruments and input RNA items placed on one NanoDrop plate
3502 22 Sep 15 olle 904       if (intNanoDropPlatePosition > 16)
3502 22 Sep 15 olle 905       {
3502 22 Sep 15 olle 906         // (17 - 24) NanoDrop plate for secondary QIAcube, positions A3 - H3
3502 22 Sep 15 olle 907         row = intNanoDropPlatePosition - 17;
3502 22 Sep 15 olle 908         col = 3;
3502 22 Sep 15 olle 909       }
3502 22 Sep 15 olle 910       else if (intNanoDropPlatePosition > 8)
3502 22 Sep 15 olle 911       {
3502 22 Sep 15 olle 912         // ( 9 - 12) NanoDrop plate for primary QIAcube, positions A2 - D2
3502 22 Sep 15 olle 913         // (13 - 16) NanoDrop plate for secondary QIAcube, positions E2 - H2
3502 22 Sep 15 olle 914         row = intNanoDropPlatePosition - 9;
3502 22 Sep 15 olle 915         col = 2;
3502 22 Sep 15 olle 916       }
3502 22 Sep 15 olle 917       else if (intNanoDropPlatePosition > 0)
3502 22 Sep 15 olle 918       {
3502 22 Sep 15 olle 919         // ( 1 -  8) NanoDrop plate for primary QIAcube, positions A1 - H1
3502 22 Sep 15 olle 920         row = intNanoDropPlatePosition - 1;
3502 22 Sep 15 olle 921         col = 1;
3502 22 Sep 15 olle 922       }
3502 22 Sep 15 olle 923       var nanoDropWell = Meludi.wellToAlpha(row) + col;
3502 22 Sep 15 olle 924       if (i < numItems)
3502 22 Sep 15 olle 925       {
3502 22 Sep 15 olle 926       
3502 22 Sep 15 olle 927         if (ExtractUtils.isSpecimen(item) || ExtractUtils.isRna(item))
3502 22 Sep 15 olle 928         {
3502 22 Sep 15 olle 929           item.rna.nanoDropWell = nanoDropWell;
3502 22 Sep 15 olle 930         }
3502 22 Sep 15 olle 931         else
3502 22 Sep 15 olle 932         {
3502 22 Sep 15 olle 933           if (item.dna)
3502 22 Sep 15 olle 934           {
3502 22 Sep 15 olle 935             //item.dna.well = null;
3502 22 Sep 15 olle 936             item.rna.nanoDropWell = null;
3502 22 Sep 15 olle 937           }          
3502 22 Sep 15 olle 938         }
3502 22 Sep 15 olle 939
3502 22 Sep 15 olle 940         if (Doc.element('rnaPlatePos'+i))
3502 22 Sep 15 olle 941         {
3502 22 Sep 15 olle 942           Doc.element('rnaPlatePos'+i).innerHTML = rnaStorageBox;
3502 22 Sep 15 olle 943         }
3502 22 Sep 15 olle 944         if (Doc.element('dnaPlatePos'+i))
3502 22 Sep 15 olle 945         {
3502 22 Sep 15 olle 946           Doc.element('dnaPlatePos'+i).innerHTML = dnaStorageBox;
3502 22 Sep 15 olle 947         }
3502 22 Sep 15 olle 948         if (item.rna)
3502 22 Sep 15 olle 949         {
3502 22 Sep 15 olle 950           if (Doc.element('rnaPos'+i))
3502 22 Sep 15 olle 951           {
3502 22 Sep 15 olle 952             Doc.element('rnaPos'+i).innerHTML = item.rna.nanoDropWell;
3502 22 Sep 15 olle 953             Doc.addOrRemoveClass('rnaPos'+i, 'nondefault', item.qiacubePosition != item.originalQiacubePosition);
3502 22 Sep 15 olle 954           }
3502 22 Sep 15 olle 955         }
3502 22 Sep 15 olle 956         else
3502 22 Sep 15 olle 957         {
3502 22 Sep 15 olle 958           if (Doc.element('rnaPos'+i))
3502 22 Sep 15 olle 959           {
3502 22 Sep 15 olle 960             if (ExtractUtils.isRna(item))
3502 22 Sep 15 olle 961             {
3502 22 Sep 15 olle 962               Doc.element('rnaPos'+i).innerHTML = nanoDropWell;
3502 22 Sep 15 olle 963             }            
3502 22 Sep 15 olle 964             if (ExtractUtils.isDna(item))
3502 22 Sep 15 olle 965             {
3502 22 Sep 15 olle 966               Doc.element('rnaPos'+i).innerHTML = null;
3502 22 Sep 15 olle 967             }            
3502 22 Sep 15 olle 968           }
3502 22 Sep 15 olle 969         }
3502 22 Sep 15 olle 970         var cmnt = Doc.element('comments'+i);
3502 22 Sep 15 olle 971         var tooltip = [];
3502 22 Sep 15 olle 972         var comment = [];
3502 22 Sep 15 olle 973         // Update comment data with description data
3502 22 Sep 15 olle 974         if (item.description || item.dna.description || item.rna.description)
3502 22 Sep 15 olle 975         {
3502 22 Sep 15 olle 976           if (ExtractUtils.isSpecimen(item))
3502 22 Sep 15 olle 977           {          
3502 22 Sep 15 olle 978             if (item.description)
3502 22 Sep 15 olle 979             {
3502 22 Sep 15 olle 980               if (!item.comment)
3502 22 Sep 15 olle 981               {
3502 22 Sep 15 olle 982                 item.comment = item.description;
3502 22 Sep 15 olle 983               }
3502 22 Sep 15 olle 984             }
3502 22 Sep 15 olle 985             if (item.rna.description)
3502 22 Sep 15 olle 986             {
3502 22 Sep 15 olle 987               if (!item.rna.comment)
3502 22 Sep 15 olle 988               {
3502 22 Sep 15 olle 989                 item.rna.comment = item.rna.description;
3502 22 Sep 15 olle 990               }
3502 22 Sep 15 olle 991             }
3502 22 Sep 15 olle 992             if (item.dna.description)
3502 22 Sep 15 olle 993             {
3502 22 Sep 15 olle 994               if (!item.dna.comment)
3502 22 Sep 15 olle 995               {
3502 22 Sep 15 olle 996                 item.dna.comment = item.dna.description;
3502 22 Sep 15 olle 997               }
3502 22 Sep 15 olle 998             }
3502 22 Sep 15 olle 999           }
3502 22 Sep 15 olle 1000           if (ExtractUtils.isRna(item))
3502 22 Sep 15 olle 1001           {          
3502 22 Sep 15 olle 1002             if (item.description)
3502 22 Sep 15 olle 1003             {
3502 22 Sep 15 olle 1004               if (!item.rna.comment)
3502 22 Sep 15 olle 1005               {
3502 22 Sep 15 olle 1006                 item.rna.comment = item.description;
3502 22 Sep 15 olle 1007               }
3502 22 Sep 15 olle 1008             }
3502 22 Sep 15 olle 1009             if (item.rna.description)
3502 22 Sep 15 olle 1010             {
3502 22 Sep 15 olle 1011               if (!item.rna.comment)
3502 22 Sep 15 olle 1012               {
3502 22 Sep 15 olle 1013                 item.rna.comment = item.rna.description;
3502 22 Sep 15 olle 1014               }
3502 22 Sep 15 olle 1015             }
3502 22 Sep 15 olle 1016           }
3502 22 Sep 15 olle 1017           if (ExtractUtils.isDna(item))
3502 22 Sep 15 olle 1018           {          
3502 22 Sep 15 olle 1019             if (item.description)
3502 22 Sep 15 olle 1020             {
3502 22 Sep 15 olle 1021               if (!item.dna.comment)
3502 22 Sep 15 olle 1022               {
3502 22 Sep 15 olle 1023                 item.dna.comment = item.description;
3502 22 Sep 15 olle 1024               }
3502 22 Sep 15 olle 1025             }
3502 22 Sep 15 olle 1026             if (item.dna.description)
3502 22 Sep 15 olle 1027             {
3502 22 Sep 15 olle 1028               if (!item.dna.comment)
3502 22 Sep 15 olle 1029               {
3502 22 Sep 15 olle 1030                 item.dna.comment = item.dna.description;
3502 22 Sep 15 olle 1031               }
3502 22 Sep 15 olle 1032             }
3502 22 Sep 15 olle 1033           }
3502 22 Sep 15 olle 1034         }
3502 22 Sep 15 olle 1035         if (item.operatorDeliveryComment || item.comment || item.dna.comment || item.rna.comment)
3502 22 Sep 15 olle 1036         {
3502 22 Sep 15 olle 1037           // Display operator delivery comments directly in the comment field
3502 22 Sep 15 olle 1038           if (item.operatorDeliveryComment)
3502 22 Sep 15 olle 1039           {
3502 22 Sep 15 olle 1040             comment[0] = item.operatorDeliveryComment;
3502 22 Sep 15 olle 1041             tooltip[tooltip.length] = 'Op.Del.Cmt: ' + item.operatorDeliveryComment;
3502 22 Sep 15 olle 1042           }
3502 22 Sep 15 olle 1043           else
3502 22 Sep 15 olle 1044           {
3502 22 Sep 15 olle 1045             comment[0] = 'Yes';
3502 22 Sep 15 olle 1046           }
3502 22 Sep 15 olle 1047           if (item.comment) tooltip[tooltip.length] = 'Specimen: ' + item.comment;
3502 22 Sep 15 olle 1048           if (item.rna.comment) tooltip[tooltip.length] = 'RNA: ' + item.rna.comment;
3502 22 Sep 15 olle 1049           if (item.dna.comment) tooltip[tooltip.length] = 'DNA: ' + item.dna.comment;
3502 22 Sep 15 olle 1050         }
3502 22 Sep 15 olle 1051
3502 22 Sep 15 olle 1052         if (cmnt)
3502 22 Sep 15 olle 1053         {        
3502 22 Sep 15 olle 1054           if (tooltip.length > 0)
3502 22 Sep 15 olle 1055           {
3502 22 Sep 15 olle 1056             cmnt.innerHTML = comment.join(', ');
3502 22 Sep 15 olle 1057             Doc.addClass(cmnt, 'nondefault');
3502 22 Sep 15 olle 1058             cmnt.title = tooltip.join('\n');
3502 22 Sep 15 olle 1059           }
3502 22 Sep 15 olle 1060           else
3502 22 Sep 15 olle 1061           {
3502 22 Sep 15 olle 1062             cmnt.innerHTML = '';
3502 22 Sep 15 olle 1063             Doc.removeClass(cmnt, 'nondefault');
3502 22 Sep 15 olle 1064             cmnt.title = null;
3502 22 Sep 15 olle 1065           }
3502 22 Sep 15 olle 1066         }
3502 22 Sep 15 olle 1067       }
3502 22 Sep 15 olle 1068     }
3502 22 Sep 15 olle 1069     
3502 22 Sep 15 olle 1070     if (duplicatePosition)
3502 22 Sep 15 olle 1071     {
3502 22 Sep 15 olle 1072       var duplicatePositionStr = ExtractUtils.getDetailedQiacubePosition(duplicatePosition, qiacubeSortedPrefixes);
3502 22 Sep 15 olle 1073       qiacubePositionsAreValid = false;
3502 22 Sep 15 olle 1074     }
3502 22 Sep 15 olle 1075     else
3502 22 Sep 15 olle 1076     {
3502 22 Sep 15 olle 1077       qiacubePositionsAreValid = true;
3502 22 Sep 15 olle 1078     }
3502 22 Sep 15 olle 1079   }
3502 22 Sep 15 olle 1080
3502 22 Sep 15 olle 1081   exreg.validateStep3 = function(event)
3502 22 Sep 15 olle 1082   {
3502 22 Sep 15 olle 1083     var valid = true;
3502 22 Sep 15 olle 1084     valid &= qiacubePositionsAreValid;
3502 22 Sep 15 olle 1085     
3502 22 Sep 15 olle 1086     if (!valid) event.preventDefault();
3502 22 Sep 15 olle 1087   }
3502 22 Sep 15 olle 1088
3502 22 Sep 15 olle 1089   // Format value as a date in format yyyy-mm-dd
3502 22 Sep 15 olle 1090   exreg.asDate = function(value)
3502 22 Sep 15 olle 1091   {
3502 22 Sep 15 olle 1092     if (!value) return '';
3502 22 Sep 15 olle 1093     if (value.length == 8)
3502 22 Sep 15 olle 1094     {
3502 22 Sep 15 olle 1095       value = value.substr(0, 4) + '-' + value.substr(4, 2) + '-' + value.substr(6, 2);
3502 22 Sep 15 olle 1096     }
3502 22 Sep 15 olle 1097     return value;
3502 22 Sep 15 olle 1098   }
3502 22 Sep 15 olle 1099
3502 22 Sep 15 olle 1100   return exreg;
3502 22 Sep 15 olle 1101 }();
3502 22 Sep 15 olle 1102
3502 22 Sep 15 olle 1103 Doc.onLoad(ExtractionStartListRemoval.initPage);
3502 22 Sep 15 olle 1104