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

Code
Comments
Other
Rev Date Author Line
2673 16 Sep 14 nicklas 1 var Protocol = function()
2673 16 Sep 14 nicklas 2 {
2673 16 Sep 14 nicklas 3   var protocol = {};
2702 26 Sep 14 nicklas 4   var debug = 0;
2673 16 Sep 14 nicklas 5   
2673 16 Sep 14 nicklas 6   var QUANTITY_REGULAR = 1.1;
2673 16 Sep 14 nicklas 7   var LOW_QUANTITY_WARNING_FACTOR = 2;
2673 16 Sep 14 nicklas 8
2673 16 Sep 14 nicklas 9   // Page initialization
2673 16 Sep 14 nicklas 10   protocol.initPage = function()
2673 16 Sep 14 nicklas 11   {
2673 16 Sep 14 nicklas 12     var pageId = Doc.getPageId();
2673 16 Sep 14 nicklas 13     if (pageId == 'protocol')
2673 16 Sep 14 nicklas 14     {
2673 16 Sep 14 nicklas 15       Buttons.addClickHandler('print-button', Wizard.goPrint);  
2673 16 Sep 14 nicklas 16
2673 16 Sep 14 nicklas 17       var libPlateId = Data.int('page-data', 'libplate');
2673 16 Sep 14 nicklas 18
2673 16 Sep 14 nicklas 19       var url = '../LibPrep.servlet?ID='+App.getSessionId();
2673 16 Sep 14 nicklas 20       url += '&cmd=GetLibraryInfoForPlate&bioplate='+libPlateId;    
2673 16 Sep 14 nicklas 21       Wizard.showLoadingAnimation('Loading Library bioplate information...');
2673 16 Sep 14 nicklas 22       Wizard.asyncJsonRequest(url, protocol.initializeProtocol);
2673 16 Sep 14 nicklas 23     }
2673 16 Sep 14 nicklas 24     else
2673 16 Sep 14 nicklas 25     {
2673 16 Sep 14 nicklas 26       Events.addEventHandler('bioplate', 'change', protocol.bioplateOnChange);
2673 16 Sep 14 nicklas 27       Events.addEventHandler('listview', 'click', protocol.viewProtocol);
2673 16 Sep 14 nicklas 28       Events.addEventHandler('plateview', 'click', protocol.viewProtocol);
2673 16 Sep 14 nicklas 29
2673 16 Sep 14 nicklas 30       var url = '../LibPrep.servlet?ID='+App.getSessionId();
2673 16 Sep 14 nicklas 31       url += '&cmd=GetConfigurationsForCaliperRunParametersExporter';
2673 16 Sep 14 nicklas 32       Wizard.asyncJsonRequest(url, protocol.initExportLinks);
2673 16 Sep 14 nicklas 33       
2673 16 Sep 14 nicklas 34       var url = '../LibPrep.servlet?ID='+App.getSessionId();
2673 16 Sep 14 nicklas 35       url += '&cmd=GetLibraryPlatesForLibPrep';
2673 16 Sep 14 nicklas 36       Wizard.showLoadingAnimation('Loading Library plates...');
2673 16 Sep 14 nicklas 37       Wizard.asyncJsonRequest(url, protocol.initializeStep1);
2673 16 Sep 14 nicklas 38     }
2673 16 Sep 14 nicklas 39   }
2673 16 Sep 14 nicklas 40
2673 16 Sep 14 nicklas 41
2673 16 Sep 14 nicklas 42   protocol.initializeStep1 = function(response)
2673 16 Sep 14 nicklas 43   {
2673 16 Sep 14 nicklas 44     var frm = document.forms['reggie'];  
2673 16 Sep 14 nicklas 45
2673 16 Sep 14 nicklas 46     var bioplates = response.bioplates;
2673 16 Sep 14 nicklas 47     var plates = frm.bioplate;
2673 16 Sep 14 nicklas 48     if (bioplates.length > 0)
2673 16 Sep 14 nicklas 49     {
2673 16 Sep 14 nicklas 50       for (var i=0; i < bioplates.length; i++)
2673 16 Sep 14 nicklas 51       {
2673 16 Sep 14 nicklas 52         var bioplate = bioplates[i];
2673 16 Sep 14 nicklas 53         var option = new Option(bioplate.name, bioplate.id);
2673 16 Sep 14 nicklas 54         option.bioplate = bioplate;
2673 16 Sep 14 nicklas 55         plates.options[plates.length] = option;
2673 16 Sep 14 nicklas 56       }
2673 16 Sep 14 nicklas 57       bioplateIsValid = true;
2673 16 Sep 14 nicklas 58       protocol.bioplateOnChange();
2673 16 Sep 14 nicklas 59     }
2673 16 Sep 14 nicklas 60     else
2673 16 Sep 14 nicklas 61     {
2673 16 Sep 14 nicklas 62       Wizard.setFatalError('No Library bioplates available for processing.');
2673 16 Sep 14 nicklas 63       return;
2673 16 Sep 14 nicklas 64     }
2673 16 Sep 14 nicklas 65     
2673 16 Sep 14 nicklas 66     Doc.show('step-1');
2673 16 Sep 14 nicklas 67   }
2673 16 Sep 14 nicklas 68   
2673 16 Sep 14 nicklas 69   protocol.initExportLinks = function(response)
2673 16 Sep 14 nicklas 70   {
2673 16 Sep 14 nicklas 71     var configurations = response.configurations;
5297 13 Feb 19 nicklas 72     var caliper96 = protocol.makeExportLink('Sample names for Caliper [csv]', 'CALIPER', 'SAMPLE_NAMES');
2673 16 Sep 14 nicklas 73     for (var i = 0; i < configurations.length; i++)
2673 16 Sep 14 nicklas 74     {
2673 16 Sep 14 nicklas 75       var config = configurations[i];
5297 13 Feb 19 nicklas 76       var btnHtml = protocol.makeExportLink('Run parameters: '+Strings.encodeTags(config.name) + ' [xml]', 'CALIPER', config.id);
2673 16 Sep 14 nicklas 77       if (config.name.indexOf('384') > 0)
2673 16 Sep 14 nicklas 78       {
3665 14 Dec 15 nicklas 79         // ignore old 96->284 plate remapping
2673 16 Sep 14 nicklas 80       }
2673 16 Sep 14 nicklas 81       else
2673 16 Sep 14 nicklas 82       {
2673 16 Sep 14 nicklas 83         caliper96 += btnHtml;
2673 16 Sep 14 nicklas 84       }
2673 16 Sep 14 nicklas 85     }
2673 16 Sep 14 nicklas 86     Doc.element('exportCaliper96').innerHTML = caliper96;
2673 16 Sep 14 nicklas 87
5297 13 Feb 19 nicklas 88     var formats = [
5297 13 Feb 19 nicklas 89       { name: 'csv', description: 'Tab-separated text file'},
5297 13 Feb 19 nicklas 90       { name: 'xlsx', description: 'Excel worksheet'}
5297 13 Feb 19 nicklas 91     ];
5297 13 Feb 19 nicklas 92     
5297 13 Feb 19 nicklas 93     var qubit = protocol.makeExportLink('Sample names for Qubit', 'QUBIT', 'SAMPLE_NAMES', formats);
2673 16 Sep 14 nicklas 94     Doc.element('exportQubit').innerHTML = qubit;
2673 16 Sep 14 nicklas 95     
2673 16 Sep 14 nicklas 96     var links = Doc.element('export').getElementsByClassName('link');
2673 16 Sep 14 nicklas 97     for (var linkNo = 0; linkNo < links.length; linkNo++)
2673 16 Sep 14 nicklas 98     {
2673 16 Sep 14 nicklas 99       Events.addEventHandler(links[linkNo], 'click', protocol.exportFile);
2673 16 Sep 14 nicklas 100     }
2673 16 Sep 14 nicklas 101   }
2673 16 Sep 14 nicklas 102   
5297 13 Feb 19 nicklas 103   // Note! fileFormats parameter (if used) must be an array of objects with 'name' and 'description' properties
5297 13 Feb 19 nicklas 104   protocol.makeExportLink = function(title, hardware, exporter, fileFormats)
2673 16 Sep 14 nicklas 105   {
2673 16 Sep 14 nicklas 106     var btn = '';
5297 13 Feb 19 nicklas 107     
5297 13 Feb 19 nicklas 108     if (fileFormats && fileFormats.length)
5297 13 Feb 19 nicklas 109     {
5297 13 Feb 19 nicklas 110       btn += '<img src="../images/export.png">&nbsp;'+title;
5297 13 Feb 19 nicklas 111       for (var i = 0; i < fileFormats.length; i++)
5297 13 Feb 19 nicklas 112       {
5297 13 Feb 19 nicklas 113         var ff = fileFormats[i];
5297 13 Feb 19 nicklas 114         btn += ' [<span class="link" data-hardware="'+hardware+'" data-exporter="'+exporter+'"';
5297 13 Feb 19 nicklas 115         btn += ' data-file-format="'+ff.name+'" title="'+ff.description+'">';
5297 13 Feb 19 nicklas 116         btn += ff.name+'</span>]';
5297 13 Feb 19 nicklas 117       }
5297 13 Feb 19 nicklas 118     }
5297 13 Feb 19 nicklas 119     else
5297 13 Feb 19 nicklas 120     {
5297 13 Feb 19 nicklas 121       btn += '<span class="link" data-hardware="'+hardware+'" data-exporter="'+exporter+'"';
5297 13 Feb 19 nicklas 122       btn += '><img src="../images/export.png">&nbsp;';
5297 13 Feb 19 nicklas 123       btn += title+'</span>';
5297 13 Feb 19 nicklas 124     }
5297 13 Feb 19 nicklas 125     btn += '<br>\n';
2673 16 Sep 14 nicklas 126     return btn;
2673 16 Sep 14 nicklas 127   }
2673 16 Sep 14 nicklas 128   
2673 16 Sep 14 nicklas 129   // Add pools to the pools list based on the bioplate selection
2673 16 Sep 14 nicklas 130   protocol.bioplateOnChange = function()
2673 16 Sep 14 nicklas 131   {
2673 16 Sep 14 nicklas 132     var frm = document.forms['reggie'];
2673 16 Sep 14 nicklas 133     var bioplate = frm.bioplate[frm.bioplate.selectedIndex].bioplate;
2673 16 Sep 14 nicklas 134     Doc.element('comments').innerHTML = Strings.encodeTags(bioplate.comments);
2673 16 Sep 14 nicklas 135     frm.poolSchema.value = bioplate.poolSchema;
2673 16 Sep 14 nicklas 136     frm.barcodeVariant.value = bioplate.barcodeVariant;
2673 16 Sep 14 nicklas 137   }
2673 16 Sep 14 nicklas 138   
2673 16 Sep 14 nicklas 139
2673 16 Sep 14 nicklas 140   protocol.viewProtocol = function(event)
2673 16 Sep 14 nicklas 141   {
2673 16 Sep 14 nicklas 142     var frm = document.forms['reggie'];
2673 16 Sep 14 nicklas 143     if (frm.bioplate && !frm.bioplate.disabled)
2673 16 Sep 14 nicklas 144     {
2673 16 Sep 14 nicklas 145       frm.view.value = Data.get(event.currentTarget, 'protocol-type');
2673 16 Sep 14 nicklas 146       frm.submit();
2673 16 Sep 14 nicklas 147     }
2673 16 Sep 14 nicklas 148   }
2673 16 Sep 14 nicklas 149
2673 16 Sep 14 nicklas 150   protocol.exportFile = function(event)
2673 16 Sep 14 nicklas 151   {
2673 16 Sep 14 nicklas 152     var frm = document.forms['reggie'];
2673 16 Sep 14 nicklas 153     if (frm.bioplate && !frm.bioplate.disabled)
2673 16 Sep 14 nicklas 154     {
2673 16 Sep 14 nicklas 155       var bioPlateId = frm.bioplate[frm.bioplate.selectedIndex].value;
2673 16 Sep 14 nicklas 156     
2673 16 Sep 14 nicklas 157       var hardware = Data.get(event.currentTarget, 'hardware');
2673 16 Sep 14 nicklas 158       var exporter = Data.get(event.currentTarget, 'exporter');
5297 13 Feb 19 nicklas 159       var fileFormat = Data.get(event.currentTarget, 'file-format');
2673 16 Sep 14 nicklas 160       
2673 16 Sep 14 nicklas 161       var url = '../LibPrep.servlet?ID='+App.getSessionId();
2673 16 Sep 14 nicklas 162       if (hardware == 'CALIPER')
2673 16 Sep 14 nicklas 163       {
2673 16 Sep 14 nicklas 164         if (exporter == 'SAMPLE_NAMES')
2673 16 Sep 14 nicklas 165         {
2673 16 Sep 14 nicklas 166           url += '&cmd=ExportSampleNamesForCaliper&bioPlateId='+bioPlateId;
2673 16 Sep 14 nicklas 167         }
2673 16 Sep 14 nicklas 168         else
2673 16 Sep 14 nicklas 169         {
2673 16 Sep 14 nicklas 170           url += '&cmd=ExportCaliperRunParameters&bioPlateId='+bioPlateId+'&configurationId='+exporter;
2673 16 Sep 14 nicklas 171         }
2673 16 Sep 14 nicklas 172       }
2673 16 Sep 14 nicklas 173       else if (hardware == 'QUBIT')
2673 16 Sep 14 nicklas 174       {
2673 16 Sep 14 nicklas 175         if (exporter == 'SAMPLE_NAMES')
2673 16 Sep 14 nicklas 176         {
5297 13 Feb 19 nicklas 177           url += '&cmd=ExportSampleNamesForQubit&bioPlateId='+bioPlateId+'&format='+fileFormat;
2673 16 Sep 14 nicklas 178         }
2673 16 Sep 14 nicklas 179         else
2673 16 Sep 14 nicklas 180         {
2673 16 Sep 14 nicklas 181           alert('not implemented');
2673 16 Sep 14 nicklas 182           return;
2673 16 Sep 14 nicklas 183         }
2673 16 Sep 14 nicklas 184       }
2673 16 Sep 14 nicklas 185       window.location = url;
2673 16 Sep 14 nicklas 186     }
2673 16 Sep 14 nicklas 187   }
2673 16 Sep 14 nicklas 188
2673 16 Sep 14 nicklas 189   protocol.initializeProtocol = function(response)
2673 16 Sep 14 nicklas 190   {
2673 16 Sep 14 nicklas 191     var list = response.libraries;
2673 16 Sep 14 nicklas 192
2673 16 Sep 14 nicklas 193
2673 16 Sep 14 nicklas 194     var schema = PoolSchema.getById(Data.get('page-data', 'schema'));
2673 16 Sep 14 nicklas 195     var barcodeVariant = PoolSchema.getBarcodeVariantByName(schema, Data.get('page-data', 'barcode-variant'));
2673 16 Sep 14 nicklas 196
2673 16 Sep 14 nicklas 197     // Pre-process the Library items
2673 16 Sep 14 nicklas 198     for (var i = 0; i < list.length; i++)
2673 16 Sep 14 nicklas 199     {
2673 16 Sep 14 nicklas 200       protocol.checkAndPreProcessLibrary(list[i], schema, barcodeVariant);
2673 16 Sep 14 nicklas 201     }
2673 16 Sep 14 nicklas 202     
2673 16 Sep 14 nicklas 203     var view = Data.get('page-data', 'view');
2673 16 Sep 14 nicklas 204     if (view == 'list')
2673 16 Sep 14 nicklas 205     {
2673 16 Sep 14 nicklas 206       protocol.viewAsList(list, schema, barcodeVariant);
2673 16 Sep 14 nicklas 207     }
2673 16 Sep 14 nicklas 208     else
2673 16 Sep 14 nicklas 209     {
2673 16 Sep 14 nicklas 210       protocol.viewAsPlate(list, schema, barcodeVariant)
2673 16 Sep 14 nicklas 211     }
2673 16 Sep 14 nicklas 212
2673 16 Sep 14 nicklas 213   }
2673 16 Sep 14 nicklas 214   
2673 16 Sep 14 nicklas 215   /**
2673 16 Sep 14 nicklas 216     Find the lowest used quantity. This is the QUANTITY_REGULAR
2673 16 Sep 14 nicklas 217     value. RNA with larger used quantities are assumed to be selected
2673 16 Sep 14 nicklas 218     for QC.
2673 16 Sep 14 nicklas 219   */
2673 16 Sep 14 nicklas 220   protocol.findLowestUsedQuantity = function(mrnaList)
2673 16 Sep 14 nicklas 221   {
2673 16 Sep 14 nicklas 222     var lowestQuantity = mrnaList[0].rna.usedQuantity;
2673 16 Sep 14 nicklas 223     for (var i = 1; i < mrnaList.length; i++)
2673 16 Sep 14 nicklas 224     {
2673 16 Sep 14 nicklas 225       var rna = mrnaList[i].rna;
2673 16 Sep 14 nicklas 226       if (rna.usedQuantity < lowestQuantity)
2673 16 Sep 14 nicklas 227       {
2673 16 Sep 14 nicklas 228         lowestQuantity = rna.usedQuantity;
2673 16 Sep 14 nicklas 229       }
2673 16 Sep 14 nicklas 230     }
2673 16 Sep 14 nicklas 231     return lowestQuantity;
2673 16 Sep 14 nicklas 232   }
2673 16 Sep 14 nicklas 233
2673 16 Sep 14 nicklas 234   
2673 16 Sep 14 nicklas 235   protocol.checkAndPreProcessLibrary = function(lib, schema, barcodeVariant)
2673 16 Sep 14 nicklas 236   {
2673 16 Sep 14 nicklas 237     var well = lib.bioWell;
3760 19 Feb 16 nicklas 238     lib.isYellow = lib.specimen && lib.specimen.YellowLabel != null;
2673 16 Sep 14 nicklas 239     var remarks = [];
2673 16 Sep 14 nicklas 240
2673 16 Sep 14 nicklas 241     // Check if default barcode has been modified
2673 16 Sep 14 nicklas 242     var indexSet = barcodeVariant.indexSets[well.column];
2673 16 Sep 14 nicklas 243     if (indexSet)
2673 16 Sep 14 nicklas 244     {
2673 16 Sep 14 nicklas 245       var defaultBarcode = indexSet.barcodes[well.row];
2673 16 Sep 14 nicklas 246       if (defaultBarcode && lib.barcode.name != defaultBarcode)
2673 16 Sep 14 nicklas 247       {
2673 16 Sep 14 nicklas 248         remarks[remarks.length] = 'Modified barcode';
2673 16 Sep 14 nicklas 249         lib.barcode.modified = true;
2673 16 Sep 14 nicklas 250       }
2673 16 Sep 14 nicklas 251     }
2673 16 Sep 14 nicklas 252     lib.remarks = remarks;
2673 16 Sep 14 nicklas 253   }
2673 16 Sep 14 nicklas 254
2673 16 Sep 14 nicklas 255   protocol.viewAsPlate = function(list, schema, barcodeVariant)
2673 16 Sep 14 nicklas 256   {
2673 16 Sep 14 nicklas 257     var rows = Data.get('page-data', 'rows');
2673 16 Sep 14 nicklas 258     var columns = Data.get('page-data', 'columns');
2673 16 Sep 14 nicklas 259     Plate.init(rows, columns, schema, WellPainter);
2673 16 Sep 14 nicklas 260     
2673 16 Sep 14 nicklas 261     for (var i = 0; i < list.length; i++)
2673 16 Sep 14 nicklas 262     {
2673 16 Sep 14 nicklas 263       var lib = list[i];
2673 16 Sep 14 nicklas 264       var well = lib.bioWell;
2673 16 Sep 14 nicklas 265       Plate.getWell(well.row, well.column).setExtract(lib);
2673 16 Sep 14 nicklas 266     }
2673 16 Sep 14 nicklas 267
2673 16 Sep 14 nicklas 268     WellPainter.barcodeVariant = barcodeVariant;
2673 16 Sep 14 nicklas 269     Plate.paint(Plate.getWells());
2673 16 Sep 14 nicklas 270     PoolSchema.buildPoolTableRow(schema, columns);
2673 16 Sep 14 nicklas 271
2673 16 Sep 14 nicklas 272     Doc.show('all-protocol');
2673 16 Sep 14 nicklas 273   }
2673 16 Sep 14 nicklas 274
2673 16 Sep 14 nicklas 275   protocol.viewAsList = function(list, schema, barcodeVariant)
2673 16 Sep 14 nicklas 276   {
3760 19 Feb 16 nicklas 277     var homeUrl = Data.get('page-data', 'home-url');
3760 19 Feb 16 nicklas 278     var yellowImg = '<img src="'+homeUrl+'/images/yellow-label-small.png">';
2673 16 Sep 14 nicklas 279     var lastPoolNum = -1;
2673 16 Sep 14 nicklas 280     for (var i = 0; i < list.length; i++)
2673 16 Sep 14 nicklas 281     {
2673 16 Sep 14 nicklas 282       var lib = list[i];
2673 16 Sep 14 nicklas 283       var well = lib.bioWell;
2673 16 Sep 14 nicklas 284   
2673 16 Sep 14 nicklas 285       var idSuffix = well.column + '.' + well.row;
3760 19 Feb 16 nicklas 286       var img = lib.isYellow ? yellowImg : '';
3760 19 Feb 16 nicklas 287       
2673 16 Sep 14 nicklas 288       Doc.removeClass('row.'+idSuffix, 'empty');
3760 19 Feb 16 nicklas 289       if (lib.isYellow) Doc.addClass('row.'+idSuffix, 'yellow-specimen');
3760 19 Feb 16 nicklas 290       Doc.element('lib.'+idSuffix).innerHTML = img+Strings.encodeTags(lib.name);
2673 16 Sep 14 nicklas 291       Doc.element('barcode.'+idSuffix).innerHTML = Strings.encodeTags(lib.barcode.name);
2673 16 Sep 14 nicklas 292       
2673 16 Sep 14 nicklas 293       var indexSet = barcodeVariant.indexSets[well.column];
2673 16 Sep 14 nicklas 294       if (indexSet)
2673 16 Sep 14 nicklas 295       {
2673 16 Sep 14 nicklas 296         var color = lib.barcode.modified ? 'bg-modified' : indexSet.color;
2673 16 Sep 14 nicklas 297         Doc.addClass('barcode.'+idSuffix, color);
2673 16 Sep 14 nicklas 298       }
2673 16 Sep 14 nicklas 299       
2673 16 Sep 14 nicklas 300       Doc.element('remarks.'+idSuffix).innerHTML = lib.remarks.join('; ');
2673 16 Sep 14 nicklas 301     }
2673 16 Sep 14 nicklas 302
2673 16 Sep 14 nicklas 303     Doc.show('all-protocol');
2673 16 Sep 14 nicklas 304   }
2673 16 Sep 14 nicklas 305   
2673 16 Sep 14 nicklas 306   
2673 16 Sep 14 nicklas 307   return protocol;
2673 16 Sep 14 nicklas 308 }();
2673 16 Sep 14 nicklas 309
2673 16 Sep 14 nicklas 310 Doc.onLoad(Protocol.initPage);
2673 16 Sep 14 nicklas 311
2673 16 Sep 14 nicklas 312
2673 16 Sep 14 nicklas 313 var WellPainter = function()
2673 16 Sep 14 nicklas 314 {
2673 16 Sep 14 nicklas 315   var painter = {};
2673 16 Sep 14 nicklas 316   
2673 16 Sep 14 nicklas 317   painter.getClassNameForWell = function(well, schema)
2673 16 Sep 14 nicklas 318   {
2673 16 Sep 14 nicklas 319     var cls = '';
2673 16 Sep 14 nicklas 320     var indexSet = painter.barcodeVariant.indexSets[well.column];
2673 16 Sep 14 nicklas 321     if (indexSet)
2673 16 Sep 14 nicklas 322     {
2673 16 Sep 14 nicklas 323       var lib = well.extract;
2673 16 Sep 14 nicklas 324       cls += lib && lib.barcode.modified ? 'bg-modified' : indexSet.color;
3760 19 Feb 16 nicklas 325       if (lib && lib.isYellow) cls += ' yellow-specimen';
2673 16 Sep 14 nicklas 326     }
2673 16 Sep 14 nicklas 327     return cls;
2673 16 Sep 14 nicklas 328   }
2673 16 Sep 14 nicklas 329   
2673 16 Sep 14 nicklas 330   painter.getWellText = function(well, schema)
2673 16 Sep 14 nicklas 331   {
2673 16 Sep 14 nicklas 332     var text = '';
2673 16 Sep 14 nicklas 333     var lib = well.extract;
2673 16 Sep 14 nicklas 334     if (lib)
2673 16 Sep 14 nicklas 335     {
2673 16 Sep 14 nicklas 336       var name = lib.name;
2673 16 Sep 14 nicklas 337       var i = name.indexOf('.m');
3760 19 Feb 16 nicklas 338       text += '<div class="lib if-yellow">'+Strings.encodeTags(name.substring(0, i))+'.<br>&nbsp;'+Strings.encodeTags(name.substring(i))+'</div>';
2673 16 Sep 14 nicklas 339       text += '<div class="barcode">'+Strings.encodeTags(lib.barcode.name)+'</div>';
2673 16 Sep 14 nicklas 340       text += '<div class="remarks">'+ lib.remarks.join('; ') + '</div>';
2673 16 Sep 14 nicklas 341     }
2673 16 Sep 14 nicklas 342     return text;
2673 16 Sep 14 nicklas 343   }
2673 16 Sep 14 nicklas 344
2673 16 Sep 14 nicklas 345   return painter;
2673 16 Sep 14 nicklas 346 }();