extensions/net.sf.basedb.reggie/trunk/resources/libprep/external_protocol.js

Code
Comments
Other
Rev Date Author Line
5887 02 Apr 20 nicklas 1 var Protocol = function()
5887 02 Apr 20 nicklas 2 {
5887 02 Apr 20 nicklas 3   var protocol = {};
5887 02 Apr 20 nicklas 4   var debug = 0;
5887 02 Apr 20 nicklas 5   
5887 02 Apr 20 nicklas 6   var LOW_QUANTITY_WARNING_FACTOR = 2;
5887 02 Apr 20 nicklas 7   var DEFAULT_DILUTION_VOLUME = 50; //µl
5887 02 Apr 20 nicklas 8
5887 02 Apr 20 nicklas 9   // Page initialization
5887 02 Apr 20 nicklas 10   protocol.initPage = function()
5887 02 Apr 20 nicklas 11   {
5887 02 Apr 20 nicklas 12     var pageId = Doc.getPageId();
5887 02 Apr 20 nicklas 13     if (pageId == 'protocol')
5887 02 Apr 20 nicklas 14     {
5887 02 Apr 20 nicklas 15       Buttons.addClickHandler('print-button', Wizard.goPrint);  
5887 02 Apr 20 nicklas 16
5887 02 Apr 20 nicklas 17       var plateId = Data.int('page-data', 'plate-id');
5887 02 Apr 20 nicklas 18
5887 02 Apr 20 nicklas 19       var url = '../LibPrep.servlet?ID='+App.getSessionId();
5887 02 Apr 20 nicklas 20       url += '&cmd=GetLibraryInfoForPlate&bioplate='+plateId;    
5887 02 Apr 20 nicklas 21       url += '&loadDilutionInfo=1';
5887 02 Apr 20 nicklas 22       Wizard.showLoadingAnimation('Loading library plate information...');
5887 02 Apr 20 nicklas 23       Wizard.asyncJsonRequest(url, protocol.initializeProtocol);
5887 02 Apr 20 nicklas 24     }
5887 02 Apr 20 nicklas 25     else
5887 02 Apr 20 nicklas 26     {
5887 02 Apr 20 nicklas 27       Events.addEventHandler('bioplate', 'change', protocol.bioplateOnChange);
5887 02 Apr 20 nicklas 28       Events.addEventHandler('listview', 'click', protocol.viewProtocol);
5887 02 Apr 20 nicklas 29       Events.addEventHandler('plateview', 'click', protocol.viewProtocol);
5888 03 Apr 20 nicklas 30       Events.addEventHandler('downloadLabelsCsv', 'click', protocol.downloadLabels);
5888 03 Apr 20 nicklas 31       Events.addEventHandler('downloadLabelsXlsx', 'click', protocol.downloadLabels);
5888 03 Apr 20 nicklas 32       Events.addEventHandler('ctgRnaSampleSheet', 'click', protocol.downloadSampleSheet);
5887 02 Apr 20 nicklas 33
5887 02 Apr 20 nicklas 34       var url = '../LibPrep.servlet?ID='+App.getSessionId();
5887 02 Apr 20 nicklas 35       url += '&cmd=GetLibraryPlatesForLibPrep&plateType=EXTERNAL_LIBRARY';
5887 02 Apr 20 nicklas 36       Wizard.showLoadingAnimation('Loading library plates...');
5887 02 Apr 20 nicklas 37       Wizard.asyncJsonRequest(url, protocol.initializeStep1);
5887 02 Apr 20 nicklas 38     }
5887 02 Apr 20 nicklas 39   }
5887 02 Apr 20 nicklas 40
5887 02 Apr 20 nicklas 41
5887 02 Apr 20 nicklas 42   protocol.initializeStep1 = function(response)
5887 02 Apr 20 nicklas 43   {
5887 02 Apr 20 nicklas 44     var frm = document.forms['reggie'];  
5887 02 Apr 20 nicklas 45
5887 02 Apr 20 nicklas 46     var bioplates = response.bioplates;
5887 02 Apr 20 nicklas 47     var plates = frm.bioplate;
5887 02 Apr 20 nicklas 48     if (bioplates.length > 0)
5887 02 Apr 20 nicklas 49     {
5887 02 Apr 20 nicklas 50       for (var i=0; i < bioplates.length; i++)
5887 02 Apr 20 nicklas 51       {
5887 02 Apr 20 nicklas 52         var bioplate = bioplates[i];
5887 02 Apr 20 nicklas 53         var name = bioplate.name + ' (' + bioplate.usedWells + ' samples';
5887 02 Apr 20 nicklas 54         if (bioplate.AutoProcessing == 'PreNormalizeRNA')
5887 02 Apr 20 nicklas 55         {
5887 02 Apr 20 nicklas 56           name += '; pre-normalized';
5887 02 Apr 20 nicklas 57         }
5887 02 Apr 20 nicklas 58         else if (bioplate.DilutionDate)
5887 02 Apr 20 nicklas 59         {
5887 02 Apr 20 nicklas 60           name += '; diluted ' + Reggie.reformatDate(bioplate.DilutionDate);
5887 02 Apr 20 nicklas 61         }
5887 02 Apr 20 nicklas 62         name += ')';
5887 02 Apr 20 nicklas 63         var option = new Option(name, bioplate.id);
5887 02 Apr 20 nicklas 64         option.bioplate = bioplate;
5887 02 Apr 20 nicklas 65         plates.options[plates.length] = option;
5887 02 Apr 20 nicklas 66       }
5887 02 Apr 20 nicklas 67       bioplateIsValid = true;
5887 02 Apr 20 nicklas 68       
5887 02 Apr 20 nicklas 69       protocol.bioplateOnChange();
5887 02 Apr 20 nicklas 70     }
5887 02 Apr 20 nicklas 71     else
5887 02 Apr 20 nicklas 72     {
5887 02 Apr 20 nicklas 73       Wizard.setFatalError('No library plates available for processing.');
5887 02 Apr 20 nicklas 74       return;
5887 02 Apr 20 nicklas 75     }
5887 02 Apr 20 nicklas 76
5887 02 Apr 20 nicklas 77     Doc.show('step-1');
5887 02 Apr 20 nicklas 78     Doc.show('gonext');
5887 02 Apr 20 nicklas 79   }
5887 02 Apr 20 nicklas 80   
5887 02 Apr 20 nicklas 81   
5887 02 Apr 20 nicklas 82   // Add pools to the pools list based on the bioplate selection
5887 02 Apr 20 nicklas 83   protocol.bioplateOnChange = function()
5887 02 Apr 20 nicklas 84   {
5887 02 Apr 20 nicklas 85     var frm = document.forms['reggie'];
5887 02 Apr 20 nicklas 86     var bioplate = frm.bioplate[frm.bioplate.selectedIndex].bioplate;
5887 02 Apr 20 nicklas 87     Doc.element('comments').innerHTML = Strings.encodeTags(bioplate.comments);
5887 02 Apr 20 nicklas 88     frm.poolSchema.value = bioplate.poolSchema;
5887 02 Apr 20 nicklas 89   }
5887 02 Apr 20 nicklas 90   
5887 02 Apr 20 nicklas 91   protocol.viewProtocol = function(event)
5887 02 Apr 20 nicklas 92   {
5887 02 Apr 20 nicklas 93     var frm = document.forms['reggie'];
5887 02 Apr 20 nicklas 94     if (frm.bioplate && !frm.bioplate.disabled)
5887 02 Apr 20 nicklas 95     {
5887 02 Apr 20 nicklas 96       frm.view.value = Data.get(event.currentTarget, 'protocol-type');
5887 02 Apr 20 nicklas 97       frm.submit();
5887 02 Apr 20 nicklas 98     }
5887 02 Apr 20 nicklas 99   }
5888 03 Apr 20 nicklas 100   
5888 03 Apr 20 nicklas 101   protocol.downloadLabels = function(event)
5888 03 Apr 20 nicklas 102   {  
5888 03 Apr 20 nicklas 103     var frm = document.forms['reggie'];
5888 03 Apr 20 nicklas 104     
5888 03 Apr 20 nicklas 105     var url = '../LibPrep.servlet?ID='+App.getSessionId();
5888 03 Apr 20 nicklas 106     url += '&cmd=DownloadLabelsForExternalSequencing';
5888 03 Apr 20 nicklas 107     url += '&bioPlateId='+frm.bioplate.value;
5888 03 Apr 20 nicklas 108     url += '&includeAll='+(frm.includeAll.checked ? 1 : 0);
5888 03 Apr 20 nicklas 109     url += '&format='+encodeURIComponent(Data.get(event.currentTarget, 'format'));
5887 02 Apr 20 nicklas 110
5888 03 Apr 20 nicklas 111     window.open(url);
5888 03 Apr 20 nicklas 112   }
5888 03 Apr 20 nicklas 113
5888 03 Apr 20 nicklas 114   protocol.downloadSampleSheet = function(event)
5887 02 Apr 20 nicklas 115   {
5887 02 Apr 20 nicklas 116     var frm = document.forms['reggie'];
5887 02 Apr 20 nicklas 117     var url = '../LibPrep.servlet?ID='+App.getSessionId();
5887 02 Apr 20 nicklas 118     url += '&cmd=GetExternalSequencingSampleSheet';
5887 02 Apr 20 nicklas 119     url += '&bioPlateId='+frm.bioplate.value;
5888 03 Apr 20 nicklas 120     url += '&template='+encodeURIComponent(Data.get(event.currentTarget, 'template'));
5887 02 Apr 20 nicklas 121     window.open(url);
5887 02 Apr 20 nicklas 122   }
5887 02 Apr 20 nicklas 123
5887 02 Apr 20 nicklas 124   protocol.initializeProtocol = function(response)
5887 02 Apr 20 nicklas 125   {
5887 02 Apr 20 nicklas 126     var plate = response.plate;
5891 07 Apr 20 nicklas 127     var list = response.libraries;
5891 07 Apr 20 nicklas 128     var normProtocol = response.protocol;
5891 07 Apr 20 nicklas 129
5891 07 Apr 20 nicklas 130     var unit = 'µg';
5891 07 Apr 20 nicklas 131     var factor = 1;
5891 07 Apr 20 nicklas 132     if (normProtocol.RNATargetAmount <= 0.5)
5887 02 Apr 20 nicklas 133     {
5891 07 Apr 20 nicklas 134       unit = 'ng';
5891 07 Apr 20 nicklas 135       factor = 1000;
5887 02 Apr 20 nicklas 136     }
5887 02 Apr 20 nicklas 137     
5891 07 Apr 20 nicklas 138     var text = Strings.encodeTags(normProtocol.name) + ' (';
5891 07 Apr 20 nicklas 139     text += normProtocol.RNATargetAmount ? Reggie.formatNumber(normProtocol.RNATargetAmount * factor, '', 1) : '? ';
5891 07 Apr 20 nicklas 140     text += unit;
5891 07 Apr 20 nicklas 141     text += ' in '+(normProtocol.RNATargetVolume || '? ')+'µl)';
5891 07 Apr 20 nicklas 142     Doc.element('normalization-protocol').innerHTML = text;
5887 02 Apr 20 nicklas 143     
5887 02 Apr 20 nicklas 144     // Pre-process the return mRNA items
5887 02 Apr 20 nicklas 145     var allPreNormalized = true;
6728 05 May 22 nicklas 146     var showLabelColumn = false;
5887 02 Apr 20 nicklas 147     for (var i = 0; i < list.length; i++)
5887 02 Apr 20 nicklas 148     {
6728 05 May 22 nicklas 149       var rna = list[i].rna;
6728 05 May 22 nicklas 150       allPreNormalized &= rna.preNormalized;
6728 05 May 22 nicklas 151       if (rna.label) showLabelColumn = true;
5887 02 Apr 20 nicklas 152       protocol.checkAndPreProcessLib(list[i]);
5887 02 Apr 20 nicklas 153     }
5887 02 Apr 20 nicklas 154     
5887 02 Apr 20 nicklas 155     var view = Data.get('page-data', 'view');
5887 02 Apr 20 nicklas 156     if (view == 'list')
5887 02 Apr 20 nicklas 157     {
5887 02 Apr 20 nicklas 158       protocol.viewAsList(list);
6728 05 May 22 nicklas 159       if (showLabelColumn)
6728 05 May 22 nicklas 160       {
6728 05 May 22 nicklas 161         Doc.removeClass('listview', 'nolabels');
6728 05 May 22 nicklas 162         Doc.show('protocol-footer');
6728 05 May 22 nicklas 163       }
5887 02 Apr 20 nicklas 164     }
5887 02 Apr 20 nicklas 165     else
5887 02 Apr 20 nicklas 166     {
5887 02 Apr 20 nicklas 167       protocol.viewAsPlate(plate, list)
5887 02 Apr 20 nicklas 168     }
5891 07 Apr 20 nicklas 169     
5887 02 Apr 20 nicklas 170   }
5887 02 Apr 20 nicklas 171   
5887 02 Apr 20 nicklas 172   protocol.checkAndPreProcessLib = function(lib, stratageneConc)
5887 02 Apr 20 nicklas 173   {
5887 02 Apr 20 nicklas 174     var rna = lib.rna;
5887 02 Apr 20 nicklas 175     // Set the 'stratagene' flag
5887 02 Apr 20 nicklas 176     rna.stratagene = Reggie.isStratagene(rna.name);
5887 02 Apr 20 nicklas 177     rna.external = Reggie.isExternal(rna.name);
5887 02 Apr 20 nicklas 178     rna.isYellow = rna.specimen && rna.specimen.YellowLabel != null;
5887 02 Apr 20 nicklas 179     if (!lib.DilutionVolume) lib.DilutionVolume = DEFAULT_DILUTION_VOLUME;
5887 02 Apr 20 nicklas 180     
5887 02 Apr 20 nicklas 181     // Set the 'QC' flag 
5887 02 Apr 20 nicklas 182     rna.qc = lib.UseForQC;
5887 02 Apr 20 nicklas 183     
5887 02 Apr 20 nicklas 184     if (stratageneConc > 0)
5887 02 Apr 20 nicklas 185     {
6218 20 Apr 21 nicklas 186       if (rna.stratagene && !rna.conc) rna.conc = stratageneConc;
5887 02 Apr 20 nicklas 187     }
5887 02 Apr 20 nicklas 188     
5887 02 Apr 20 nicklas 189     // Calculate volume to use and water to add based on concentration
5887 02 Apr 20 nicklas 190     var remarks = [];
6218 20 Apr 21 nicklas 191     if (rna.conc && rna.usedQuantity)
5887 02 Apr 20 nicklas 192     {
6218 20 Apr 21 nicklas 193       rna.volume = Math.ceil(10000*rna.usedQuantity/rna.conc) / 10; // µl
5887 02 Apr 20 nicklas 194       
5887 02 Apr 20 nicklas 195       var totalVolume = lib.DilutionConc ? 1000 * rna.usedQuantity / lib.DilutionConc : lib.DilutionVolume;
5887 02 Apr 20 nicklas 196       if (totalVolume < lib.DilutionVolume) 
5887 02 Apr 20 nicklas 197       {
5887 02 Apr 20 nicklas 198         totalVolume = lib.DilutionVolume;
5887 02 Apr 20 nicklas 199       }
5887 02 Apr 20 nicklas 200       else if (totalVolume - 0.05 > lib.DilutionVolume) // Use 0.05 to avoid issues with 50.0000000001 > 50.0
5887 02 Apr 20 nicklas 201       {
5887 02 Apr 20 nicklas 202         remarks[remarks.length] = 'Large mix; Use '+Reggie.formatNumber(lib.DilutionVolume, 'µl', 1);
5887 02 Apr 20 nicklas 203       }
5887 02 Apr 20 nicklas 204       rna.water = totalVolume-rna.volume;
5887 02 Apr 20 nicklas 205     }
5887 02 Apr 20 nicklas 206     
5887 02 Apr 20 nicklas 207     // check for some issues that may indicate problems
5887 02 Apr 20 nicklas 208     if (rna.qc) remarks[remarks.length] = 'QC';
5887 02 Apr 20 nicklas 209     if (!rna.stratagene && !rna.external)
5887 02 Apr 20 nicklas 210     {
5887 02 Apr 20 nicklas 211       if (!rna.bioWell && !rna.preNormalized)
5887 02 Apr 20 nicklas 212       {
5887 02 Apr 20 nicklas 213         remarks[remarks.length] = 'No location';
5887 02 Apr 20 nicklas 214       }
5887 02 Apr 20 nicklas 215       if (!rna.remainingQuantity)
5887 02 Apr 20 nicklas 216       {
5887 02 Apr 20 nicklas 217         remarks[remarks.length] = 'No quantity';
5887 02 Apr 20 nicklas 218       }
5887 02 Apr 20 nicklas 219       else if (rna.remainingQuantity < rna.usedQuantity)
5887 02 Apr 20 nicklas 220       {
5887 02 Apr 20 nicklas 221         remarks[remarks.length] = 'Not enough RNA';
5887 02 Apr 20 nicklas 222       }
5887 02 Apr 20 nicklas 223       else if (rna.remainingQuantity < rna.usedQuantity * LOW_QUANTITY_WARNING_FACTOR && !rna.preNormalized)
5887 02 Apr 20 nicklas 224       {
5887 02 Apr 20 nicklas 225         remarks[remarks.length] = 'Low quantity';
5887 02 Apr 20 nicklas 226       }
6218 20 Apr 21 nicklas 227       if (!rna.conc)
5887 02 Apr 20 nicklas 228       {
6218 20 Apr 21 nicklas 229         remarks[remarks.length] = 'No concentration';
5887 02 Apr 20 nicklas 230       }
5887 02 Apr 20 nicklas 231     }
5887 02 Apr 20 nicklas 232     else
5887 02 Apr 20 nicklas 233     {
6218 20 Apr 21 nicklas 234       if (!rna.conc && rna.usedQuantity) 
5887 02 Apr 20 nicklas 235       {
5887 02 Apr 20 nicklas 236         remarks[remarks.length] = 'Use ' + Numbers.formatNumber(rna.usedQuantity, 2) + ' µg RNA';
5887 02 Apr 20 nicklas 237       }
5887 02 Apr 20 nicklas 238     }
5887 02 Apr 20 nicklas 239     if (lib.comment) remarks[remarks.length] = lib.comment;
5887 02 Apr 20 nicklas 240     rna.remarks = remarks;
5887 02 Apr 20 nicklas 241   }
5887 02 Apr 20 nicklas 242
5887 02 Apr 20 nicklas 243   protocol.viewAsPlate = function(plate, list)
5887 02 Apr 20 nicklas 244   {
5887 02 Apr 20 nicklas 245     var schema = PoolSchema.getById(plate.poolSchema);
5887 02 Apr 20 nicklas 246     Plate.init(plate.rows, plate.columns, schema, WellPainter);
5887 02 Apr 20 nicklas 247     
5887 02 Apr 20 nicklas 248     for (var i = 0; i < list.length; i++)
5887 02 Apr 20 nicklas 249     {
5887 02 Apr 20 nicklas 250       var lib = list[i];
5887 02 Apr 20 nicklas 251       var well = lib.bioWell;
5887 02 Apr 20 nicklas 252       Plate.getWell(well.row, well.column).setExtract(lib);
5887 02 Apr 20 nicklas 253     }
5887 02 Apr 20 nicklas 254
5887 02 Apr 20 nicklas 255     Plate.paint(Plate.getWells());
5887 02 Apr 20 nicklas 256     PoolSchema.buildPoolTableRow(schema, plate.columns);
5887 02 Apr 20 nicklas 257     Doc.show('all-protocol');
5887 02 Apr 20 nicklas 258   }
5887 02 Apr 20 nicklas 259
5887 02 Apr 20 nicklas 260   protocol.viewAsList = function(list)
5887 02 Apr 20 nicklas 261   {
5887 02 Apr 20 nicklas 262     var homeUrl = Data.get('page-data', 'home-url');
5887 02 Apr 20 nicklas 263     var yellowImg = '<img src="'+homeUrl+'/images/yellow-label-small.png">';
5887 02 Apr 20 nicklas 264     for (var i = 0; i < list.length; i++)
5887 02 Apr 20 nicklas 265     {
5887 02 Apr 20 nicklas 266       var lib = list[i];
5887 02 Apr 20 nicklas 267       var rna = lib.rna;
5887 02 Apr 20 nicklas 268       var idSuffix = lib.bioWell.column + '.' + lib.bioWell.row;
5887 02 Apr 20 nicklas 269       var tableRow = Doc.element('row.'+idSuffix);
5887 02 Apr 20 nicklas 270       var img = rna.isYellow ? yellowImg : '';
5887 02 Apr 20 nicklas 271       
5887 02 Apr 20 nicklas 272       Doc.removeClass(tableRow, 'empty');
5887 02 Apr 20 nicklas 273       if (rna.external) Doc.addClass(tableRow, 'external');
5887 02 Apr 20 nicklas 274       if (rna.stratagene) Doc.addClass(tableRow, 'stratagene');
5887 02 Apr 20 nicklas 275       if (rna.isYellow) Doc.addClass(tableRow, 'yellow-specimen');
5887 02 Apr 20 nicklas 276       Doc.element('rna.'+idSuffix).innerHTML = img+Strings.encodeTags(rna.external && lib.externalId ? lib.externalId : rna.name);
6728 05 May 22 nicklas 277       Doc.element('label.'+idSuffix).innerHTML = Strings.encodeTags(rna.label);
5887 02 Apr 20 nicklas 278       Doc.element('box.'+idSuffix).innerHTML = Strings.encodeTags(protocol.getPlateCoordinate(rna, true));
6218 20 Apr 21 nicklas 279       Doc.element('conc.'+idSuffix).innerHTML = Numbers.formatNumber(rna.conc, 2);
5887 02 Apr 20 nicklas 280       Doc.element('remain.'+idSuffix).innerHTML = Numbers.formatNumber(rna.remainingQuantity, 2);
5887 02 Apr 20 nicklas 281       Doc.element('volume.'+idSuffix).innerHTML = Numbers.formatNumber(rna.volume, 1);
5887 02 Apr 20 nicklas 282       Doc.element('water.'+idSuffix).innerHTML = rna.water > 0 ? Numbers.formatNumber(rna.water, 1) : '—';
5887 02 Apr 20 nicklas 283       Doc.element('remarks.'+idSuffix).innerHTML = rna.remarks.join('; ');
5887 02 Apr 20 nicklas 284     }
5887 02 Apr 20 nicklas 285     
5887 02 Apr 20 nicklas 286     Doc.show('all-protocol');
5887 02 Apr 20 nicklas 287   }
5887 02 Apr 20 nicklas 288   
5887 02 Apr 20 nicklas 289   
5887 02 Apr 20 nicklas 290   protocol.getPlateCoordinate = function(rna, includePlateName)
5887 02 Apr 20 nicklas 291   {
5887 02 Apr 20 nicklas 292     var c = '';
5887 02 Apr 20 nicklas 293     if (rna.bioWell)
5887 02 Apr 20 nicklas 294     {
5887 02 Apr 20 nicklas 295       if (includePlateName) c += rna.bioWell.bioPlate.name;
5887 02 Apr 20 nicklas 296       c += ' ' + Reggie.wellToAlpha(rna.bioWell.row) + (rna.bioWell.column+1);
5887 02 Apr 20 nicklas 297     }
5887 02 Apr 20 nicklas 298     else if (rna.preNormalized)
5887 02 Apr 20 nicklas 299     {
5887 02 Apr 20 nicklas 300       c = 'PreNorm.';
5887 02 Apr 20 nicklas 301     }
5887 02 Apr 20 nicklas 302     else
5887 02 Apr 20 nicklas 303     {
5887 02 Apr 20 nicklas 304       c = ' ';
5887 02 Apr 20 nicklas 305     }
5887 02 Apr 20 nicklas 306     return c;
5887 02 Apr 20 nicklas 307   }
5887 02 Apr 20 nicklas 308
5887 02 Apr 20 nicklas 309     
5887 02 Apr 20 nicklas 310   return protocol;
5887 02 Apr 20 nicklas 311 }();
5887 02 Apr 20 nicklas 312
5887 02 Apr 20 nicklas 313 Doc.onLoad(Protocol.initPage);
5887 02 Apr 20 nicklas 314
5887 02 Apr 20 nicklas 315
5887 02 Apr 20 nicklas 316 var WellPainter = function()
5887 02 Apr 20 nicklas 317 {
5887 02 Apr 20 nicklas 318   var painter = {};
5887 02 Apr 20 nicklas 319   
5887 02 Apr 20 nicklas 320   painter.getClassNameForWell = function(well)
5887 02 Apr 20 nicklas 321   {
5887 02 Apr 20 nicklas 322     var cls = '';
5887 02 Apr 20 nicklas 323     var lib = well.extract;
5887 02 Apr 20 nicklas 324     if (lib)
5887 02 Apr 20 nicklas 325     {
5887 02 Apr 20 nicklas 326       var rna = lib.rna;
5887 02 Apr 20 nicklas 327       if (rna.qc) cls += ' qc';
5887 02 Apr 20 nicklas 328       if (rna.external) cls += ' external';
5887 02 Apr 20 nicklas 329       if (rna.stratagene) cls += ' stratagene';
5887 02 Apr 20 nicklas 330       if (rna.isYellow) cls += ' yellow-specimen';
5887 02 Apr 20 nicklas 331     }
5887 02 Apr 20 nicklas 332     return cls;
5887 02 Apr 20 nicklas 333   }
5887 02 Apr 20 nicklas 334   
5887 02 Apr 20 nicklas 335   painter.getWellText = function(well)
5887 02 Apr 20 nicklas 336   {
5887 02 Apr 20 nicklas 337     var text = '';
5887 02 Apr 20 nicklas 338     var lib = well.extract;
5887 02 Apr 20 nicklas 339     if (lib)
5887 02 Apr 20 nicklas 340     {
5887 02 Apr 20 nicklas 341       var rna = lib.rna;
6728 05 May 22 nicklas 342       var name = rna.name;
6728 05 May 22 nicklas 343       if (rna.label) 
6728 05 May 22 nicklas 344       {
6728 05 May 22 nicklas 345         name = rna.label;
6728 05 May 22 nicklas 346       }
6728 05 May 22 nicklas 347       else if (rna.external && mrna.externalId)
6728 05 May 22 nicklas 348       {
6728 05 May 22 nicklas 349         name = mrna.externalId;
6728 05 May 22 nicklas 350       }
6728 05 May 22 nicklas 351       text += '<div class="rna if-yellow">'+Strings.encodeTags(name)+'</div>';
5887 02 Apr 20 nicklas 352       text += '<div class="box">'+Strings.encodeTags(Protocol.getPlateCoordinate(rna, true))+'</div>';
5887 02 Apr 20 nicklas 353       text += '<div class="remain">'+Numbers.formatNumber(rna.remainingQuantity, 2, 'µg')+'</div>';
6218 20 Apr 21 nicklas 354       text += '<div class="conc">'+Numbers.formatNumber(rna.conc, 2, 'ng/µl') + '</div>';
5887 02 Apr 20 nicklas 355
5887 02 Apr 20 nicklas 356       if (rna.volume >= 0 && rna.water >= 0)
5887 02 Apr 20 nicklas 357       {
5887 02 Apr 20 nicklas 358         text += '<div><span class="volume">'+Numbers.formatNumber(rna.volume, 1)+'µl</span>';
5887 02 Apr 20 nicklas 359         text += '<span class="water">'+(rna.water > 0 ? Numbers.formatNumber(rna.water, 1)+'µl' : '—')+'</span></div>';
5887 02 Apr 20 nicklas 360       }
5887 02 Apr 20 nicklas 361       text += '<div class="remarks">'+ rna.remarks.join('; ') + '</div>';
5887 02 Apr 20 nicklas 362     }
5887 02 Apr 20 nicklas 363     return text;
5887 02 Apr 20 nicklas 364   }
5887 02 Apr 20 nicklas 365
5887 02 Apr 20 nicklas 366   return painter;
5887 02 Apr 20 nicklas 367 }();
5887 02 Apr 20 nicklas 368