extensions/net.sf.basedb.reggie/trunk/resources/mipsprep/design_mipsplate.js

Code
Comments
Other
Rev Date Author Line
5390 29 Apr 19 nicklas 1 var MipsPlate = function()
5390 29 Apr 19 nicklas 2 {
5390 29 Apr 19 nicklas 3   var mips = {};
5390 29 Apr 19 nicklas 4   var barcodesByName = [];
5390 29 Apr 19 nicklas 5   var hasInitProtocols = false;
5390 29 Apr 19 nicklas 6   
5390 29 Apr 19 nicklas 7   var debug = 0;
5390 29 Apr 19 nicklas 8   
5392 02 May 19 nicklas 9   var plateTypeNormalizedDNA;
5390 29 Apr 19 nicklas 10   var subtypeDna;
5390 29 Apr 19 nicklas 11   var subtypeDnaNormalized;
5390 29 Apr 19 nicklas 12
5390 29 Apr 19 nicklas 13   // Page initialization
5390 29 Apr 19 nicklas 14   mips.initPage = function()
5390 29 Apr 19 nicklas 15   {
5390 29 Apr 19 nicklas 16     
5390 29 Apr 19 nicklas 17     // Step 1
5390 29 Apr 19 nicklas 18     Events.addEventHandler('step-1', 'wizard-validate', mips.validateStep1);
5390 29 Apr 19 nicklas 19
5392 02 May 19 nicklas 20     Buttons.addClickHandler('btnAddAliquotPlates', mips.addAliquotPlates);
5392 02 May 19 nicklas 21     Buttons.addClickHandler('btnRemoveAliquotPlates', mips.removeAliquotPlates);
5454 28 May 19 nicklas 22     Buttons.addClickHandler('moveUp', mips.movePlate);
5454 28 May 19 nicklas 23     Buttons.addClickHandler('moveDown', mips.movePlate);
5392 02 May 19 nicklas 24     Events.addEventHandler('plates', 'base-selected', mips.aliquotPlateSelected);
5448 27 May 19 nicklas 25
5440 20 May 19 nicklas 26     Events.addEventHandler('pool-row', 'click', mips.togglePool);
5440 20 May 19 nicklas 27     Events.addEventHandler('pool-row', 'mouseover', mips.highlightPool);
5440 20 May 19 nicklas 28     Events.addEventHandler('pool-row', 'mouseout', mips.highlightPool);
5446 24 May 19 nicklas 29     Events.addEventHandler('plate-row', 'click', mips.togglePool);
5446 24 May 19 nicklas 30     Events.addEventHandler('plate-row', 'mouseover', mips.highlightGroup);
5446 24 May 19 nicklas 31     Events.addEventHandler('plate-row', 'mouseout', mips.highlightGroup);
5440 20 May 19 nicklas 32     
5390 29 Apr 19 nicklas 33     // Navigation
5390 29 Apr 19 nicklas 34     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
5390 29 Apr 19 nicklas 35     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
5390 29 Apr 19 nicklas 36     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
5390 29 Apr 19 nicklas 37     Buttons.addClickHandler('goregister', Wizard.goRegister);
5390 29 Apr 19 nicklas 38     
5390 29 Apr 19 nicklas 39     // Final registration
5390 29 Apr 19 nicklas 40     Events.addEventHandler('wizard', 'wizard-submit', mips.submit);
5390 29 Apr 19 nicklas 41     
5390 29 Apr 19 nicklas 42     var url = '../Mips.servlet?ID='+App.getSessionId();
5390 29 Apr 19 nicklas 43     url += '&cmd=GetNextAutoGeneratedPlateName';
5390 29 Apr 19 nicklas 44     url += '&bioPlateType=MIPS';
5390 29 Apr 19 nicklas 45     Wizard.showLoadingAnimation('Loading next MIPs plate');
5390 29 Apr 19 nicklas 46     Wizard.asyncJsonRequest(url, mips.nextPlateNameLoaded);
5390 29 Apr 19 nicklas 47   }
5390 29 Apr 19 nicklas 48   
5390 29 Apr 19 nicklas 49   mips.nextPlateNameLoaded = function(response)
5390 29 Apr 19 nicklas 50   {
5390 29 Apr 19 nicklas 51     Plate.name = response.name;
5390 29 Apr 19 nicklas 52     Doc.element('plateName').innerHTML = Strings.encodeTags(Plate.name);
5390 29 Apr 19 nicklas 53
5390 29 Apr 19 nicklas 54     var columns = 12;
5390 29 Apr 19 nicklas 55     var rows = 8;
5392 02 May 19 nicklas 56     Plate.init(rows, columns, WellPainter);
5390 29 Apr 19 nicklas 57     Plate.paint(Plate.getWells());
5390 29 Apr 19 nicklas 58     
5390 29 Apr 19 nicklas 59     Doc.show('step-1');
5390 29 Apr 19 nicklas 60     Doc.show('gocancel');
5390 29 Apr 19 nicklas 61     Doc.show('goregister');
5390 29 Apr 19 nicklas 62     
5390 29 Apr 19 nicklas 63     window.addEventListener('beforeunload', mips.confirmLeaveWizard);
5526 25 Jun 19 nicklas 64     Wizard.keepSessionAlive();
5390 29 Apr 19 nicklas 65   }
5390 29 Apr 19 nicklas 66   
5413 09 May 19 nicklas 67   mips.toggleInfo = function(event)
5413 09 May 19 nicklas 68   {
5413 09 May 19 nicklas 69     var show = event.currentTarget.checked;
5413 09 May 19 nicklas 70     Doc.addOrRemoveClass('plate', 'hide-'+event.currentTarget.id, !show);
5413 09 May 19 nicklas 71   }
5413 09 May 19 nicklas 72   
5414 09 May 19 nicklas 73
5414 09 May 19 nicklas 74   
5390 29 Apr 19 nicklas 75   /**
5390 29 Apr 19 nicklas 76     Ask for confirmation to abort if DNA has been placed on the plate.
5390 29 Apr 19 nicklas 77   */
5390 29 Apr 19 nicklas 78   mips.confirmLeaveWizard = function(event)
5390 29 Apr 19 nicklas 79   {
5390 29 Apr 19 nicklas 80     if (Plate.getUsed().length > 0)
5390 29 Apr 19 nicklas 81     {
5390 29 Apr 19 nicklas 82       event.preventDefault();
5390 29 Apr 19 nicklas 83     }
5390 29 Apr 19 nicklas 84   }
5390 29 Apr 19 nicklas 85
5390 29 Apr 19 nicklas 86   mips.validateStep1 = function(event)
5390 29 Apr 19 nicklas 87   {
5390 29 Apr 19 nicklas 88     var numErrors = 0;
5390 29 Apr 19 nicklas 89     var numWarnings = 0;
5390 29 Apr 19 nicklas 90     var numDna = 0;
5390 29 Apr 19 nicklas 91     var wells = Plate.getWells();
5390 29 Apr 19 nicklas 92     for (var i = 0; i < wells.length; i++)
5390 29 Apr 19 nicklas 93     {
5390 29 Apr 19 nicklas 94       var well = wells[i];
5390 29 Apr 19 nicklas 95       var dna = well.extract;
5390 29 Apr 19 nicklas 96       if (well.hasWarning())
5390 29 Apr 19 nicklas 97       {
5390 29 Apr 19 nicklas 98         numWarnings++;
5390 29 Apr 19 nicklas 99       }
5390 29 Apr 19 nicklas 100       if (well.hasError())
5390 29 Apr 19 nicklas 101       {
5390 29 Apr 19 nicklas 102         numErrors++;
5390 29 Apr 19 nicklas 103       }
5390 29 Apr 19 nicklas 104       else
5390 29 Apr 19 nicklas 105       {
5390 29 Apr 19 nicklas 106         if (dna && dna.id) numDna++;
5390 29 Apr 19 nicklas 107       }
5390 29 Apr 19 nicklas 108     }
5390 29 Apr 19 nicklas 109
5390 29 Apr 19 nicklas 110     if (numErrors > 0)
5390 29 Apr 19 nicklas 111     {
5390 29 Apr 19 nicklas 112       event.preventDefault();
5390 29 Apr 19 nicklas 113       return;
5390 29 Apr 19 nicklas 114     }
5390 29 Apr 19 nicklas 115     
5390 29 Apr 19 nicklas 116     if (numDna == 0)
5390 29 Apr 19 nicklas 117     {
5455 28 May 19 nicklas 118       Wizard.showGoNextConfirmation(false, 'The plate is empty!');
5390 29 Apr 19 nicklas 119       event.preventDefault();
5390 29 Apr 19 nicklas 120       return;
5390 29 Apr 19 nicklas 121     }
5390 29 Apr 19 nicklas 122   }
5390 29 Apr 19 nicklas 123
5454 28 May 19 nicklas 124   mips.movePlate = function(event)
5392 02 May 19 nicklas 125   {
5454 28 May 19 nicklas 126     var moveDown = Data.int(event.currentTarget, 'down');
5454 28 May 19 nicklas 127     Forms.moveListOptions('plates', moveDown);
5454 28 May 19 nicklas 128     mips.layoutFromAliquotPlates();
5392 02 May 19 nicklas 129   }
5392 02 May 19 nicklas 130   
5454 28 May 19 nicklas 131   
5392 02 May 19 nicklas 132   // Temporary array for holding selected aliqout plates before loading more information via the servlet
5392 02 May 19 nicklas 133   var newPlates;
5392 02 May 19 nicklas 134   /**
5392 02 May 19 nicklas 135     Open dialog for adding more aliquot plates.
5392 02 May 19 nicklas 136   */
6824 30 Aug 22 nicklas 137   mips.addAliquotPlates = function(event)
5392 02 May 19 nicklas 138   {
5392 02 May 19 nicklas 139     var frm = document.forms['reggie'];
5392 02 May 19 nicklas 140     var emptyColumn = Plate.getFirstEmptyColumn();
5392 02 May 19 nicklas 141     if (emptyColumn == -1)
5392 02 May 19 nicklas 142     {
5392 02 May 19 nicklas 143       Forms.showNotification(event.currentTarget, 'There are no more empty columns.');
5392 02 May 19 nicklas 144       return;
5392 02 May 19 nicklas 145     }
5458 29 May 19 nicklas 146
5458 29 May 19 nicklas 147     newPlates = []; // Clear the temp array
5458 29 May 19 nicklas 148     var current = []; // Filter out currently included plates
5392 02 May 19 nicklas 149     var plates = frm.plates;
5392 02 May 19 nicklas 150     for (var plateNo = 0; plateNo < plates.length; plateNo++)
5392 02 May 19 nicklas 151     {
5392 02 May 19 nicklas 152       current[current.length] = plates[plateNo].value;
5392 02 May 19 nicklas 153     }
5458 29 May 19 nicklas 154     
5458 29 May 19 nicklas 155     var url = 'select_aliquot_plates.jsp?ID='+App.getSessionId();
5458 29 May 19 nicklas 156     if (current.length > 0) url += '&ignore='+current.join(',');
5460 03 Jun 19 nicklas 157     Dialogs.openPopup(url, 'SelectAliquotPlates', 900, 600);
5392 02 May 19 nicklas 158   }
5392 02 May 19 nicklas 159   
5392 02 May 19 nicklas 160   /**
5392 02 May 19 nicklas 161     Removes the selected aliquot plates.
5392 02 May 19 nicklas 162   */
5392 02 May 19 nicklas 163   mips.removeAliquotPlates = function()
5392 02 May 19 nicklas 164   {
5392 02 May 19 nicklas 165     var frm = document.forms['reggie'];
5392 02 May 19 nicklas 166     var plates = frm.plates;
5392 02 May 19 nicklas 167     for (var plateNo = 0; plateNo < plates.length; plateNo++)
5392 02 May 19 nicklas 168     {
5392 02 May 19 nicklas 169       if (plates[plateNo].selected) plates[plateNo--] = null;
5392 02 May 19 nicklas 170     }
5392 02 May 19 nicklas 171     mips.layoutFromAliquotPlates();
5392 02 May 19 nicklas 172   }
5392 02 May 19 nicklas 173
5392 02 May 19 nicklas 174   
5392 02 May 19 nicklas 175   /**
5392 02 May 19 nicklas 176     Callback when a new aliquot plate has been selected for including on the MIPs plate.
5392 02 May 19 nicklas 177     Adds selected plates to the temp array. When all have been collected, a request
5392 02 May 19 nicklas 178     to server is made to load more information about the DNA on the plate(s).
5392 02 May 19 nicklas 179   */
5392 02 May 19 nicklas 180   mips.aliquotPlateSelected = function(event)
5392 02 May 19 nicklas 181   {
5392 02 May 19 nicklas 182     var frm = document.forms['reggie'];
5392 02 May 19 nicklas 183     var name = event.detail.name;
5392 02 May 19 nicklas 184     var id = event.detail.id;
5392 02 May 19 nicklas 185     
5392 02 May 19 nicklas 186     // Check if the selected plate is a new plate or not
5392 02 May 19 nicklas 187     var plateList = frm.plates;
5392 02 May 19 nicklas 188     var isNew = true;
5392 02 May 19 nicklas 189     for (var i = 0; i < plateList.length; i++)
5392 02 May 19 nicklas 190     {
5458 29 May 19 nicklas 191       if (plateList[i].plate.id == id)
5392 02 May 19 nicklas 192       {
5392 02 May 19 nicklas 193         isNew = false;
5392 02 May 19 nicklas 194         break;
5392 02 May 19 nicklas 195       }
5392 02 May 19 nicklas 196     }
5392 02 May 19 nicklas 197     if (isNew)
5392 02 May 19 nicklas 198     {
5392 02 May 19 nicklas 199       newPlates[newPlates.length] = id;
5392 02 May 19 nicklas 200     }
5392 02 May 19 nicklas 201     
5392 02 May 19 nicklas 202     // Load information about DNA on the plates
5392 02 May 19 nicklas 203     if (event.detail.remaining == 0 && newPlates.length > 0)
5392 02 May 19 nicklas 204     {
5392 02 May 19 nicklas 205       var url = '../Mips.servlet?ID='+App.getSessionId();
5392 02 May 19 nicklas 206       url += '&cmd=GetUnusedAliquotsFromPlates';
5392 02 May 19 nicklas 207       url += '&plates='+newPlates.join(',');
5392 02 May 19 nicklas 208       Wizard.showLoadingAnimation('Loading aliquots from ' + encodeURIComponent(event.detail.name));
5392 02 May 19 nicklas 209       Wizard.asyncJsonRequest(url, mips.aliquotsAndPlatesLoaded);
5458 29 May 19 nicklas 210       newPlates = [];
5392 02 May 19 nicklas 211     }
5392 02 May 19 nicklas 212   }
5392 02 May 19 nicklas 213   
5392 02 May 19 nicklas 214   /**
5392 02 May 19 nicklas 215     Callback after we have got DNA information for the new plates.
5392 02 May 19 nicklas 216   */
5392 02 May 19 nicklas 217   mips.aliquotsAndPlatesLoaded = function(response)
5392 02 May 19 nicklas 218   {
5392 02 May 19 nicklas 219     var frm = document.forms['reggie'];
5392 02 May 19 nicklas 220     var plates = response.plates;
5418 10 May 19 nicklas 221     var emptyPlates = [];
5392 02 May 19 nicklas 222     for (var plateNo = 0; plateNo < plates.length; plateNo++)
5392 02 May 19 nicklas 223     {
5392 02 May 19 nicklas 224       var plate = plates[plateNo];
5392 02 May 19 nicklas 225       var aliquots = plate.aliquots;
5418 10 May 19 nicklas 226       if (aliquots.length > 0)
5418 10 May 19 nicklas 227       {
5454 28 May 19 nicklas 228         var option = new Option(plate.name + ' ('+aliquots.length+' aliquots)', plate.id);
5418 10 May 19 nicklas 229         option.plate = plate;
5418 10 May 19 nicklas 230         frm.plates[frm.plates.length] = option;
5418 10 May 19 nicklas 231       }
5418 10 May 19 nicklas 232       else
5418 10 May 19 nicklas 233       {
5418 10 May 19 nicklas 234         emptyPlates[emptyPlates.length] = plate.name;
5418 10 May 19 nicklas 235       }
5392 02 May 19 nicklas 236     }
5418 10 May 19 nicklas 237     if (emptyPlates.length > 0)
5418 10 May 19 nicklas 238     {
5418 10 May 19 nicklas 239       var isOrAre = emptyPlates.length == 1 ? ' is' : ' are';
5454 28 May 19 nicklas 240       Forms.showNotification('btnAddAliquotPlates', Strings.encodeTags(emptyPlates.join(', ')) + isOrAre + '  empty');
5418 10 May 19 nicklas 241     }
5392 02 May 19 nicklas 242     mips.layoutFromAliquotPlates();
5392 02 May 19 nicklas 243   }
5392 02 May 19 nicklas 244   
5392 02 May 19 nicklas 245   /**
5392 02 May 19 nicklas 246     Auto-layout the MIPs plate from the selected aliquot plates.
5392 02 May 19 nicklas 247   */
5392 02 May 19 nicklas 248   mips.layoutFromAliquotPlates = function()
5392 02 May 19 nicklas 249   {
5392 02 May 19 nicklas 250     var frm = document.forms['reggie'];
5392 02 May 19 nicklas 251     var wells = Plate.getWells();
5392 02 May 19 nicklas 252     Plate.clear(wells, true);
5448 27 May 19 nicklas 253     Doc.hide('pool-row');
5448 27 May 19 nicklas 254     Doc.hide('plate-row');
5454 28 May 19 nicklas 255     Doc.hide('unplaced-aliquots');
5448 27 May 19 nicklas 256     Wizard.hideGoNextConfirmation();
5446 24 May 19 nicklas 257     COLUMN_DATA = new Array(Plate.columns);
5440 20 May 19 nicklas 258
5392 02 May 19 nicklas 259     var plates = frm.plates;
5446 24 May 19 nicklas 260     var mipsCurrentColumn = -1; // Current column on MIPs plate
5454 28 May 19 nicklas 261     PLATE_LOOP:
5392 02 May 19 nicklas 262     for (var plateNo = 0; plateNo < plates.length; plateNo++)
5392 02 May 19 nicklas 263     {
5392 02 May 19 nicklas 264       var plate = plates[plateNo].plate;
5392 02 May 19 nicklas 265       var selected = plates[plateNo].selected;
5392 02 May 19 nicklas 266       var aliquots = plate.aliquots;
5446 24 May 19 nicklas 267       var aliquotCurrentColumn = -1; // Current column on the aliquot plate
5392 02 May 19 nicklas 268       
5417 10 May 19 nicklas 269       plate.numPlacedAliquots = 0;
5440 20 May 19 nicklas 270       plate.columnSpan = 0;
5446 24 May 19 nicklas 271       for (var aqNo = 0; aqNo < aliquots.length; aqNo++)
5392 02 May 19 nicklas 272       {
5392 02 May 19 nicklas 273         var aliquot = aliquots[aqNo];
5446 24 May 19 nicklas 274         if (aliquot.bioWell.column != aliquotCurrentColumn)
5446 24 May 19 nicklas 275         {
5446 24 May 19 nicklas 276           mipsCurrentColumn++;
5454 28 May 19 nicklas 277           if (mipsCurrentColumn >= Plate.columns)
5454 28 May 19 nicklas 278           {
5454 28 May 19 nicklas 279             var remain = aliquots.length - aqNo;
5454 28 May 19 nicklas 280             Doc.element('unplaced-aliquots').innerHTML = remain + ' aliquots from ' +Strings.encodeTags(plate.name) + ' could not be placed';
5454 28 May 19 nicklas 281             Doc.show('unplaced-aliquots', 'table-cell');
5454 28 May 19 nicklas 282             plateNo++;
5454 28 May 19 nicklas 283             break PLATE_LOOP;
5454 28 May 19 nicklas 284           }
5446 24 May 19 nicklas 285           aliquotCurrentColumn = aliquot.bioWell.column;
5446 24 May 19 nicklas 286           plate.columnSpan++;
5446 24 May 19 nicklas 287           var col = {};
5446 24 May 19 nicklas 288           col.plateId = plate.id;
5446 24 May 19 nicklas 289           COLUMN_DATA[mipsCurrentColumn] = col;
5446 24 May 19 nicklas 290         }
5446 24 May 19 nicklas 291         var well = Plate.getWell(aliquot.bioWell.row, mipsCurrentColumn);
5413 09 May 19 nicklas 292         well.setExtract(aliquot);
5454 28 May 19 nicklas 293         //well.selected = selected;
5417 10 May 19 nicklas 294         plate.numPlacedAliquots++;
5392 02 May 19 nicklas 295       }
5392 02 May 19 nicklas 296     }
5454 28 May 19 nicklas 297     //if (plateNo < plates.length) frm.plates.length = plateNo;
5446 24 May 19 nicklas 298     
5603 13 Sep 19 nicklas 299     // Analyze columns on the MIPs plate with resepect to MIPS_Panel and PoolVolume
5446 24 May 19 nicklas 300     for (var colNo = 0; colNo < Plate.columns; colNo++)
5446 24 May 19 nicklas 301     {
5446 24 May 19 nicklas 302       col = COLUMN_DATA[colNo];
5446 24 May 19 nicklas 303       if (!col) 
5446 24 May 19 nicklas 304       {
5446 24 May 19 nicklas 305         col = {};
5446 24 May 19 nicklas 306         COLUMN_DATA[colNo] = col;
5446 24 May 19 nicklas 307       }
5448 27 May 19 nicklas 308       col.numAliquots = 0;
5603 13 Sep 19 nicklas 309       col.panelCounter = new ItemCounter();
5448 27 May 19 nicklas 310       col.poolVolumeCounter = new ItemCounter();
5446 24 May 19 nicklas 311       for (var rowNo = 0; rowNo < Plate.rows; rowNo++)
5446 24 May 19 nicklas 312       {
5446 24 May 19 nicklas 313         var well = Plate.getWell(rowNo, colNo);
5446 24 May 19 nicklas 314         if (well.extract)
5446 24 May 19 nicklas 315         {
5446 24 May 19 nicklas 316           var aliquot = well.extract;
5448 27 May 19 nicklas 317           col.numAliquots++;
5603 13 Sep 19 nicklas 318           col.panelCounter.count(aliquot.MIPS_Panel);
5448 27 May 19 nicklas 319           col.poolVolumeCounter.count(aliquot.MIPS_PoolVolume);
5446 24 May 19 nicklas 320         }
5446 24 May 19 nicklas 321       }
5603 13 Sep 19 nicklas 322       col.MIPS_Panel = col.panelCounter.maxKey;
5603 13 Sep 19 nicklas 323       col.isMissingMIPSPanel = col.panelCounter.numCounted != col.numAliquots;
5603 13 Sep 19 nicklas 324       col.hasMultipleMIPSPanels = col.panelCounter.numKeys() > 1;
5448 27 May 19 nicklas 325       col.MIPS_PoolVolume = col.poolVolumeCounter.maxKey;
5448 27 May 19 nicklas 326       col.hasMultiplePoolVolumes = col.poolVolumeCounter.numKeys() > 1;
5446 24 May 19 nicklas 327     }
5446 24 May 19 nicklas 328     
5455 28 May 19 nicklas 329     if (plates.length > 0)
5455 28 May 19 nicklas 330     {
5455 28 May 19 nicklas 331       mips.buildPoolRow();
5455 28 May 19 nicklas 332       mips.buildPlateRow();
5455 28 May 19 nicklas 333     }
5392 02 May 19 nicklas 334     Plate.paint(wells);
5448 27 May 19 nicklas 335     
5448 27 May 19 nicklas 336     var wells = Plate.getWells();
5448 27 May 19 nicklas 337     var numWarnings = 0;
5448 27 May 19 nicklas 338     for (var i = 0; i < wells.length; i++)
5448 27 May 19 nicklas 339     {
5448 27 May 19 nicklas 340       var well = wells[i];
5448 27 May 19 nicklas 341       if (well.hasWarning())
5448 27 May 19 nicklas 342       {
5448 27 May 19 nicklas 343         numWarnings++;
5448 27 May 19 nicklas 344       }
5448 27 May 19 nicklas 345     }
5448 27 May 19 nicklas 346
5448 27 May 19 nicklas 347     if (numWarnings > 0)
5448 27 May 19 nicklas 348     {
5448 27 May 19 nicklas 349       Wizard.showGoNextConfirmation(true, 'Check to verify registration of plate with warnings.');
5448 27 May 19 nicklas 350     }
5392 02 May 19 nicklas 351   }
5392 02 May 19 nicklas 352   
5448 27 May 19 nicklas 353   mips.buildPoolRow = function()
5440 20 May 19 nicklas 354   {
5440 20 May 19 nicklas 355     var html = '<th></th>';
5603 13 Sep 19 nicklas 356     var pools = [];  // A 'pool' is a number of columns with the same MIPS_Panel
5446 24 May 19 nicklas 357     var currentPool = {};
5446 24 May 19 nicklas 358
5446 24 May 19 nicklas 359     for (var colNo = 0; colNo < COLUMN_DATA.length; colNo++)
5446 24 May 19 nicklas 360     {
5446 24 May 19 nicklas 361       var col = COLUMN_DATA[colNo];
5603 13 Sep 19 nicklas 362       if ((col.MIPS_Panel != currentPool.name) || (col.numAliquots == 0 && currentPool.numAliquots != 0))
5446 24 May 19 nicklas 363       {
5603 13 Sep 19 nicklas 364         // The column has a different MIPS_Panel than the previous one so we create a new pool
5446 24 May 19 nicklas 365         currentPool = {};
5603 13 Sep 19 nicklas 366         currentPool.name = col.MIPS_Panel;
5446 24 May 19 nicklas 367         currentPool.startCol = colNo;
5446 24 May 19 nicklas 368         currentPool.columnSpan = 1;
5603 13 Sep 19 nicklas 369         currentPool.hasMultipleMIPSPanels = col.hasMultipleMIPSPanels;
5448 27 May 19 nicklas 370         currentPool.hasMultiplePoolVolumes = col.hasMultiplePoolVolumes;
5603 13 Sep 19 nicklas 371         currentPool.isMissingMIPSPanel = col.isMissingMIPSPanel;
5448 27 May 19 nicklas 372         currentPool.numAliquots = col.numAliquots;
5446 24 May 19 nicklas 373         pools[pools.length] = currentPool;
5446 24 May 19 nicklas 374       }
5446 24 May 19 nicklas 375       else if (currentPool)
5446 24 May 19 nicklas 376       {
5604 13 Sep 19 nicklas 377         // The column has the same MIPS_Panel as the previous one, we make the pool span across multiple columns
5446 24 May 19 nicklas 378         currentPool.columnSpan++;
5448 27 May 19 nicklas 379         currentPool.numAliquots += col.numAliquots;
5603 13 Sep 19 nicklas 380         if (col.isMissingMIPSPanel) currentPool.isMissingMIPSPanel = true;
5603 13 Sep 19 nicklas 381         if (col.hasMultipleMIPSPanels) currentPool.hasMultipleMIPSPanels = true;
5448 27 May 19 nicklas 382         if (col.hasMultiplePoolVolumes) currentPool.hasMultiplePoolVolumes = true;
5446 24 May 19 nicklas 383       }
5446 24 May 19 nicklas 384     }
5446 24 May 19 nicklas 385     
5446 24 May 19 nicklas 386     colNo = 0;
5446 24 May 19 nicklas 387     for (var poolNo = 0; poolNo < pools.length; poolNo++)
5446 24 May 19 nicklas 388     {
5446 24 May 19 nicklas 389       var pool = pools[poolNo];
5446 24 May 19 nicklas 390       var poolClass = 'pool link';
5446 24 May 19 nicklas 391       var poolText = null;
5454 28 May 19 nicklas 392             
5454 28 May 19 nicklas 393       COLUMN_DATA[colNo].poolClass = 'pool-left';
5446 24 May 19 nicklas 394       if (pool.columnSpan == 1)
5446 24 May 19 nicklas 395       {
5454 28 May 19 nicklas 396         if (pool.name) COLUMN_DATA[colNo].poolClass += ' pool-right';
5446 24 May 19 nicklas 397       }
5446 24 May 19 nicklas 398       else
5446 24 May 19 nicklas 399       {
5454 28 May 19 nicklas 400         if (pool.name)
5446 24 May 19 nicklas 401         {
5454 28 May 19 nicklas 402           for (var i = 1; i < pool.columnSpan-1; i++)
5454 28 May 19 nicklas 403           {
5454 28 May 19 nicklas 404             COLUMN_DATA[colNo+i].poolClass = 'pool-middle';
5454 28 May 19 nicklas 405           }
5454 28 May 19 nicklas 406           COLUMN_DATA[colNo+pool.columnSpan-1].poolClass = 'pool-right';
5446 24 May 19 nicklas 407         }
5446 24 May 19 nicklas 408       }
5446 24 May 19 nicklas 409
5448 27 May 19 nicklas 410       if (pool.numAliquots > 0)
5446 24 May 19 nicklas 411       {
5603 13 Sep 19 nicklas 412         if (pool.hasMultiplePoolVolumes || pool.isMissingMIPSPanel) 
5446 24 May 19 nicklas 413         {
5446 24 May 19 nicklas 414           poolClass += ' pool-warning';
5603 13 Sep 19 nicklas 415           if (pool.isMissingMIPSPanel)
5448 27 May 19 nicklas 416           {
5603 13 Sep 19 nicklas 417             poolText = 'Some aliquots have no MIPS_Panel!';
5448 27 May 19 nicklas 418           }
5520 20 Jun 19 nicklas 419           else if (pool.hasMultiplePoolVolumes)
5448 27 May 19 nicklas 420           {
5520 20 Jun 19 nicklas 421             poolText = 'Some aliquots have a different pool volume!';
5448 27 May 19 nicklas 422           }
5446 24 May 19 nicklas 423         }
5520 20 Jun 19 nicklas 424         if (pool.name) poolClass += ' ' + MipsColor.getColor(pool.name);
5446 24 May 19 nicklas 425         html += '<th id="pool.' + poolNo + '" colspan="'+pool.columnSpan+'"';
5446 24 May 19 nicklas 426         html += ' class="'+poolClass+'"';
5446 24 May 19 nicklas 427         html += ' data-start-col="'+pool.startCol+'"';
5446 24 May 19 nicklas 428         html += ' data-end-col="'+(pool.startCol+pool.columnSpan-1)+'"';
5446 24 May 19 nicklas 429         if (poolText) html += ' title="'+poolText+'"';
5603 13 Sep 19 nicklas 430         html += '>'+Strings.encodeTags(pool.name || 'No MIPS_Panel')+'</th>';
5446 24 May 19 nicklas 431       }
5446 24 May 19 nicklas 432       else
5446 24 May 19 nicklas 433       {
5446 24 May 19 nicklas 434         poolClass = '';
5446 24 May 19 nicklas 435         if (colNo > 0) poolClass += ' nopool-after-pool';
5446 24 May 19 nicklas 436         if (colNo + pool.columnSpan < 12) poolClass += ' nopool-before-pool';
5446 24 May 19 nicklas 437         html += '<th colspan="'+pool.columnSpan+'"';
5446 24 May 19 nicklas 438         html += ' class="'+poolClass+'"';
5446 24 May 19 nicklas 439         html += '></th>';
5446 24 May 19 nicklas 440       }
5446 24 May 19 nicklas 441       colNo += pool.columnSpan;
5446 24 May 19 nicklas 442     }
5454 28 May 19 nicklas 443     html += '<td style="padding:0;"></td>';
5446 24 May 19 nicklas 444     
5448 27 May 19 nicklas 445     var row = Doc.element('pool-row');
5446 24 May 19 nicklas 446     row.innerHTML = html;
5446 24 May 19 nicklas 447     Doc.show(row);
5446 24 May 19 nicklas 448   }
5446 24 May 19 nicklas 449   
5446 24 May 19 nicklas 450   mips.buildPlateRow = function()
5446 24 May 19 nicklas 451   {
5446 24 May 19 nicklas 452     var html = '<th></th>';
5440 20 May 19 nicklas 453     var totalSpan = 0;
5440 20 May 19 nicklas 454     var colNo = 0;
5454 28 May 19 nicklas 455     for (var plateNo = 0; plateNo < plates.length && colNo < Plate.columns; plateNo++)
5440 20 May 19 nicklas 456     {
5440 20 May 19 nicklas 457       var plate = plates[plateNo].plate;
5454 28 May 19 nicklas 458       var poolClass = 'group link';
5454 28 May 19 nicklas 459       var poolText = null;
5446 24 May 19 nicklas 460       
5440 20 May 19 nicklas 461       if (plate.columnSpan == 1)
5440 20 May 19 nicklas 462       {
5446 24 May 19 nicklas 463         COLUMN_DATA[colNo].groupClass = 'group-left group-right';
5440 20 May 19 nicklas 464       }
5440 20 May 19 nicklas 465       else
5440 20 May 19 nicklas 466       {
5446 24 May 19 nicklas 467         COLUMN_DATA[colNo].groupClass = 'group-left';
5440 20 May 19 nicklas 468         for (var i = 1; i < plate.columnSpan-1; i++)
5440 20 May 19 nicklas 469         {
5446 24 May 19 nicklas 470           COLUMN_DATA[colNo+i].groupClass = 'group-middle';
5440 20 May 19 nicklas 471         }
5446 24 May 19 nicklas 472         COLUMN_DATA[colNo+plate.columnSpan-1].groupClass = 'group-right';
5440 20 May 19 nicklas 473       }
5446 24 May 19 nicklas 474       
5454 28 May 19 nicklas 475       if (plate.numPlacedAliquots != plate.aliquots.length)
5454 28 May 19 nicklas 476       {
5454 28 May 19 nicklas 477         poolClass += ' pool-warning';
5454 28 May 19 nicklas 478         poolText = 'This plate has ' + (plate.aliquots.length - plate.numPlacedAliquots) + ' more aliquots';
5454 28 May 19 nicklas 479       }
5454 28 May 19 nicklas 480       
5446 24 May 19 nicklas 481       html += '<th id="group.' + plateNo + '" colspan="'+plate.columnSpan+'"';
5440 20 May 19 nicklas 482       html += ' class="'+poolClass+'"';
5446 24 May 19 nicklas 483       html += ' data-start-col="' + colNo + '"';
5446 24 May 19 nicklas 484       html += ' data-end-col="' + (colNo+plate.columnSpan-1) + '"';
5454 28 May 19 nicklas 485       if (poolText) html += ' title="'+poolText+'"';
5440 20 May 19 nicklas 486       html += '>'+Strings.encodeTags(plate.name)+'</th>';
5446 24 May 19 nicklas 487       colNo += plate.columnSpan;
5440 20 May 19 nicklas 488     }
5454 28 May 19 nicklas 489     if (colNo < Plate.columns)
5440 20 May 19 nicklas 490     {
5454 28 May 19 nicklas 491       html += '<th class="nopool-after-pool" colspan="'+(Plate.columns-colNo)+'"></th>';
5440 20 May 19 nicklas 492     }
5454 28 May 19 nicklas 493     html += '<td style="padding:0;"></td>';
5446 24 May 19 nicklas 494     var row = document.getElementById('plate-row');
5440 20 May 19 nicklas 495     row.innerHTML = html;
5446 24 May 19 nicklas 496     Doc.show(row);
5440 20 May 19 nicklas 497   }
5440 20 May 19 nicklas 498   
5390 29 Apr 19 nicklas 499   mips.submit = function()
5390 29 Apr 19 nicklas 500   {
5390 29 Apr 19 nicklas 501     var frm = document.forms['reggie'];
5390 29 Apr 19 nicklas 502
5390 29 Apr 19 nicklas 503     var submitInfo = {};
5390 29 Apr 19 nicklas 504     
5417 10 May 19 nicklas 505     var mipsPlate = {};
5417 10 May 19 nicklas 506     mipsPlate.name = Plate.name;
5417 10 May 19 nicklas 507     mipsPlate.comments = frm.comments.value;
5417 10 May 19 nicklas 508     mipsPlate.wells = [];
5417 10 May 19 nicklas 509     submitInfo.mipsPlate = mipsPlate;
5390 29 Apr 19 nicklas 510     
5417 10 May 19 nicklas 511     var aliquotPlates = [];
5417 10 May 19 nicklas 512     submitInfo.aliquotPlates = aliquotPlates
5417 10 May 19 nicklas 513     for (var i = 0; i < frm.plates.length; i++)
5417 10 May 19 nicklas 514     {
5417 10 May 19 nicklas 515       var plate = frm.plates[i].plate;
5417 10 May 19 nicklas 516       var tmp = {};
5417 10 May 19 nicklas 517       tmp.id = plate.id;
5417 10 May 19 nicklas 518       tmp.numAliquots = plate.aliquots.length;
5417 10 May 19 nicklas 519       tmp.numPlacedAliquots = plate.numPlacedAliquots;
5417 10 May 19 nicklas 520       aliquotPlates[i] = tmp;
5417 10 May 19 nicklas 521     }
5390 29 Apr 19 nicklas 522
5390 29 Apr 19 nicklas 523     var wells = Plate.getWells();
5390 29 Apr 19 nicklas 524     for (var i = 0; i < wells.length; i++)
5390 29 Apr 19 nicklas 525     {
5390 29 Apr 19 nicklas 526       var well = wells[i];
5418 10 May 19 nicklas 527       var aliquot = well.extract;
5418 10 May 19 nicklas 528       if (aliquot && aliquot.id)
5390 29 Apr 19 nicklas 529       {
5390 29 Apr 19 nicklas 530         var tmp = {};
5390 29 Apr 19 nicklas 531         tmp.row = well.row;
5390 29 Apr 19 nicklas 532         tmp.column = well.column;
5418 10 May 19 nicklas 533         tmp.aliquot = {};
5418 10 May 19 nicklas 534         tmp.aliquot.id = aliquot.id;
5417 10 May 19 nicklas 535         mipsPlate.wells[mipsPlate.wells.length] = tmp;
5390 29 Apr 19 nicklas 536       }
5390 29 Apr 19 nicklas 537     }
5417 10 May 19 nicklas 538     
5390 29 Apr 19 nicklas 539     var url = '../Mips.servlet?ID='+App.getSessionId();
5417 10 May 19 nicklas 540     url += '&cmd=CreateMIPsPlate';
5390 29 Apr 19 nicklas 541     Wizard.showLoadingAnimation('Performing registration...');
5390 29 Apr 19 nicklas 542     Wizard.asyncJsonRequest(url, mips.submissionResults, 'POST', JSON.stringify(submitInfo));
5390 29 Apr 19 nicklas 543   }
5390 29 Apr 19 nicklas 544   
5390 29 Apr 19 nicklas 545   mips.submissionResults = function(response)
5390 29 Apr 19 nicklas 546   {
5390 29 Apr 19 nicklas 547     window.removeEventListener('beforeunload', mips.confirmLeaveWizard);
5390 29 Apr 19 nicklas 548     Wizard.showFinalMessage(response.messages);
5390 29 Apr 19 nicklas 549     Doc.show('gorestart');
5390 29 Apr 19 nicklas 550   }
5390 29 Apr 19 nicklas 551   
5390 29 Apr 19 nicklas 552   mips.initElements = function(element, autoInit)
5390 29 Apr 19 nicklas 553   {
5390 29 Apr 19 nicklas 554     if (autoInit == 'plate-col')
5390 29 Apr 19 nicklas 555     {
5390 29 Apr 19 nicklas 556       Events.addEventHandler(element, 'click', mips.toggleColumn);
5390 29 Apr 19 nicklas 557       Events.addEventHandler(element, 'mouseover', mips.highlightColumn);
5390 29 Apr 19 nicklas 558       Events.addEventHandler(element, 'mouseout', mips.highlightColumn);
5390 29 Apr 19 nicklas 559     }
5390 29 Apr 19 nicklas 560     else if (autoInit == 'plate-row')
5390 29 Apr 19 nicklas 561     {
5390 29 Apr 19 nicklas 562       Events.addEventHandler(element, 'click', mips.toggleRow);
5390 29 Apr 19 nicklas 563       Events.addEventHandler(element, 'mouseover', mips.highlightRow);
5390 29 Apr 19 nicklas 564       Events.addEventHandler(element, 'mouseout', mips.highlightRow);
5390 29 Apr 19 nicklas 565     }
5390 29 Apr 19 nicklas 566     else if (autoInit == 'plate-well')
5390 29 Apr 19 nicklas 567     {
5390 29 Apr 19 nicklas 568       Events.addEventHandler(element, 'click', mips.toggleWell);
5390 29 Apr 19 nicklas 569     }
5390 29 Apr 19 nicklas 570   }
5390 29 Apr 19 nicklas 571
5390 29 Apr 19 nicklas 572   // Toggle the selected status of a single well
5390 29 Apr 19 nicklas 573   mips.toggleWell = function(event)
5390 29 Apr 19 nicklas 574   {
5390 29 Apr 19 nicklas 575     var row = Data.int(event.currentTarget, 'row');
5390 29 Apr 19 nicklas 576     var column = Data.int(event.currentTarget, 'col');
5390 29 Apr 19 nicklas 577     var well = Plate.getWell(row, column);
5390 29 Apr 19 nicklas 578     Plate.toggleSelected([well]);
5390 29 Apr 19 nicklas 579   }
5390 29 Apr 19 nicklas 580
5390 29 Apr 19 nicklas 581   // Toggle the selected status of a complete row
5390 29 Apr 19 nicklas 582   mips.toggleRow = function(event)
5390 29 Apr 19 nicklas 583   {
5390 29 Apr 19 nicklas 584     var row = Data.int(event.currentTarget, 'row');
5390 29 Apr 19 nicklas 585     Plate.toggleSelected(Plate.getRow(row));
5390 29 Apr 19 nicklas 586   }
5390 29 Apr 19 nicklas 587
5390 29 Apr 19 nicklas 588   // Toggle the selected status of a complete column
5390 29 Apr 19 nicklas 589   mips.toggleColumn = function(event)
5390 29 Apr 19 nicklas 590   {
5390 29 Apr 19 nicklas 591     var column = Data.int(event.currentTarget, 'col');
5390 29 Apr 19 nicklas 592     Plate.toggleSelected(Plate.getColumn(column));
5390 29 Apr 19 nicklas 593   }
5390 29 Apr 19 nicklas 594   
5440 20 May 19 nicklas 595   // Toggle the selected status of a pool
5440 20 May 19 nicklas 596   mips.togglePool = function(event)
5440 20 May 19 nicklas 597   {
5446 24 May 19 nicklas 598     var startCol = Data.int(event.target, 'start-col');
5446 24 May 19 nicklas 599     var endCol = Data.int(event.target, 'end-col');
5446 24 May 19 nicklas 600     Plate.toggleSelected(Plate.getPool(startCol, endCol));
5440 20 May 19 nicklas 601   }
5440 20 May 19 nicklas 602   
5390 29 Apr 19 nicklas 603   // Highlight enable/disable all wells in a column
5390 29 Apr 19 nicklas 604   mips.highlightColumn = function(event)
5390 29 Apr 19 nicklas 605   {
5390 29 Apr 19 nicklas 606     var column = Data.int(event.currentTarget, 'col');
5390 29 Apr 19 nicklas 607     var on = event.type == 'mouseover';
5390 29 Apr 19 nicklas 608     
5390 29 Apr 19 nicklas 609     Doc.addOrRemoveClass(event.currentTarget, 'highlight-column', on);
5390 29 Apr 19 nicklas 610     var wells = Plate.getColumn(column);
5390 29 Apr 19 nicklas 611     Plate.setHighlight(wells, 'highlight-column', on);
5390 29 Apr 19 nicklas 612   }
5390 29 Apr 19 nicklas 613
5390 29 Apr 19 nicklas 614   // Highlight enable/disable all wells in a row
5390 29 Apr 19 nicklas 615   mips.highlightRow = function(event)
5390 29 Apr 19 nicklas 616   {
5390 29 Apr 19 nicklas 617     var row = Data.int(event.currentTarget, 'row');
5390 29 Apr 19 nicklas 618     var on = event.type == 'mouseover';
5390 29 Apr 19 nicklas 619     
5390 29 Apr 19 nicklas 620     Doc.addOrRemoveClass(event.currentTarget, 'highlight-row', on);
5390 29 Apr 19 nicklas 621     var wells = Plate.getRow(row);
5390 29 Apr 19 nicklas 622     Plate.setHighlight(wells, 'highlight-row', on);
5390 29 Apr 19 nicklas 623   }
5390 29 Apr 19 nicklas 624   
5440 20 May 19 nicklas 625   // Highligt enable/disable all wells in a pool
5440 20 May 19 nicklas 626   mips.highlightPool = function(event)
5440 20 May 19 nicklas 627   {
5446 24 May 19 nicklas 628     var startCol = Data.int(event.target, 'start-col');
5446 24 May 19 nicklas 629     var endCol = Data.int(event.target, 'end-col');
5440 20 May 19 nicklas 630     var on = event.type == 'mouseover';
5446 24 May 19 nicklas 631     Doc.addOrRemoveClass(event.target, 'highlight-pool', on);
5446 24 May 19 nicklas 632     var wells = Plate.getPool(startCol, endCol);
5446 24 May 19 nicklas 633     Plate.setHighlight(wells, 'highlight-pool', on);
5440 20 May 19 nicklas 634   }
5440 20 May 19 nicklas 635
5446 24 May 19 nicklas 636   // Highligt enable/disable all wells in a pool
5446 24 May 19 nicklas 637   mips.highlightGroup = function(event)
5446 24 May 19 nicklas 638   {
5446 24 May 19 nicklas 639     var startCol = Data.int(event.target, 'start-col');
5446 24 May 19 nicklas 640     var endCol = Data.int(event.target, 'end-col');
5446 24 May 19 nicklas 641     var on = event.type == 'mouseover';
5446 24 May 19 nicklas 642     Doc.addOrRemoveClass(event.target, 'highlight-group', on);
5446 24 May 19 nicklas 643     var wells = Plate.getPool(startCol, endCol);
5446 24 May 19 nicklas 644     Plate.setHighlight(wells, 'highlight-group', on);
5446 24 May 19 nicklas 645   }
5446 24 May 19 nicklas 646
5390 29 Apr 19 nicklas 647   return mips;
5390 29 Apr 19 nicklas 648 }();
5390 29 Apr 19 nicklas 649
5390 29 Apr 19 nicklas 650 Doc.onLoad(MipsPlate.initPage);
5390 29 Apr 19 nicklas 651 Doc.addElementInitializer(MipsPlate.initElements);
5390 29 Apr 19 nicklas 652
5446 24 May 19 nicklas 653 var COLUMN_DATA = [];
5440 20 May 19 nicklas 654
5390 29 Apr 19 nicklas 655 var WellPainter = function()
5390 29 Apr 19 nicklas 656 {
5390 29 Apr 19 nicklas 657   var painter = {};
5390 29 Apr 19 nicklas 658   
5390 29 Apr 19 nicklas 659   // Add class indicators for replicates and QC assigned wells
5390 29 Apr 19 nicklas 660   painter.getClassNameForWell = function(well)
5390 29 Apr 19 nicklas 661   {
5390 29 Apr 19 nicklas 662     var cls = '';
5390 29 Apr 19 nicklas 663     if (well.extract)
5390 29 Apr 19 nicklas 664     {
5413 09 May 19 nicklas 665       cls += ' primary';
5603 13 Sep 19 nicklas 666       if (well.extract.MIPS_Panel) cls += ' ' + MipsColor.getColor(well.extract.MIPS_Panel);
5390 29 Apr 19 nicklas 667     }
5390 29 Apr 19 nicklas 668     if (well.column == Plate.columns-1) cls += ' last-child';
5446 24 May 19 nicklas 669     if (COLUMN_DATA[well.column]) 
5446 24 May 19 nicklas 670     {
5448 27 May 19 nicklas 671       cls += ' ' + (COLUMN_DATA[well.column].poolClass || '');
5448 27 May 19 nicklas 672       cls += ' ' + (COLUMN_DATA[well.column].groupClass || '');
5446 24 May 19 nicklas 673     }
5390 29 Apr 19 nicklas 674     return cls;
5390 29 Apr 19 nicklas 675   }
5390 29 Apr 19 nicklas 676   
5390 29 Apr 19 nicklas 677   painter.getWellText = function(well)
5390 29 Apr 19 nicklas 678   {
5390 29 Apr 19 nicklas 679     var text = '';
5390 29 Apr 19 nicklas 680     if (well.extract)
5390 29 Apr 19 nicklas 681     {
5390 29 Apr 19 nicklas 682       // The well contains DNA
5413 09 May 19 nicklas 683       var aliquot = well.extract;
5481 11 Jun 19 nicklas 684       text += '<div class="name">'+Reggie.softLineBreaks(Strings.encodeTags(aliquot.name))+'</div>';
5390 29 Apr 19 nicklas 685       
5390 29 Apr 19 nicklas 686       var warningMsg = [];
5413 09 May 19 nicklas 687       if (aliquot.bioWell)
5390 29 Apr 19 nicklas 688       {
5413 09 May 19 nicklas 689         var dnaWell = aliquot.bioWell;
5440 20 May 19 nicklas 690         text += '<div class="location">['+dnaWell.location+']</div>';
5390 29 Apr 19 nicklas 691       }
5392 02 May 19 nicklas 692       else
5390 29 Apr 19 nicklas 693       {
5461 03 Jun 19 nicklas 694         warningMsg[warningMsg.length] = 'No location!';
5390 29 Apr 19 nicklas 695       }
5448 27 May 19 nicklas 696   
5448 27 May 19 nicklas 697       if (aliquot.MIPS_PoolVolume != null)
5414 09 May 19 nicklas 698       {
5461 03 Jun 19 nicklas 699         text += '<div class="volume">'+Numbers.formatNumber(aliquot.MIPS_PoolVolume, 0, 'µl')+'</div>';
5448 27 May 19 nicklas 700         if (aliquot.MIPS_PoolVolume != COLUMN_DATA[well.column].MIPS_PoolVolume)
5414 09 May 19 nicklas 701         {
5461 03 Jun 19 nicklas 702           warningMsg[warningMsg.length] = 'PoolVolume!';
5414 09 May 19 nicklas 703         }
5414 09 May 19 nicklas 704       }
5603 13 Sep 19 nicklas 705       if (aliquot.MIPS_Panel != null)
5414 09 May 19 nicklas 706       {
5603 13 Sep 19 nicklas 707         text += '<div class="mips-panel">'+Strings.encodeTags(aliquot.MIPS_Panel)+'</div>';
5414 09 May 19 nicklas 708       }
5448 27 May 19 nicklas 709       else
5390 29 Apr 19 nicklas 710       {
5603 13 Sep 19 nicklas 711         well.setError('No MIPS_Panel');
5392 02 May 19 nicklas 712       }
5413 09 May 19 nicklas 713       
5448 27 May 19 nicklas 714       if (aliquot.MIPS_Form != null || aliquot.MIPS_NormalTumor != null)
5390 29 Apr 19 nicklas 715       {
5448 27 May 19 nicklas 716         text += '<div class="mips-form">';
5448 27 May 19 nicklas 717         if (aliquot.MIPS_NormalTumor != null) text += '<span>'+Strings.encodeTags(aliquot.MIPS_NormalTumor)+'</span>';
5448 27 May 19 nicklas 718         if (aliquot.MIPS_Form != null) text += '<span>'+Strings.encodeTags(aliquot.MIPS_Form)+'</span>';
5448 27 May 19 nicklas 719         text += '</div>';
5390 29 Apr 19 nicklas 720       }
5413 09 May 19 nicklas 721
5413 09 May 19 nicklas 722       if (aliquot.comment)
5413 09 May 19 nicklas 723       {
5413 09 May 19 nicklas 724         text += '<div class="comment">'+Strings.encodeTags(aliquot.comment)+'</div>';
5413 09 May 19 nicklas 725       }
5413 09 May 19 nicklas 726
5413 09 May 19 nicklas 727       if (aliquot.DO_NOT_USE)
5413 09 May 19 nicklas 728       {
5413 09 May 19 nicklas 729         warningMsg[warningMsg.length] = 'DoNotUse-'+Strings.encodeTags(aliquot.DO_NOT_USE);
5413 09 May 19 nicklas 730       }
5390 29 Apr 19 nicklas 731       if (warningMsg.length > 0)
5390 29 Apr 19 nicklas 732       {
5390 29 Apr 19 nicklas 733         well.setWarning(warningMsg.join('; '));
5390 29 Apr 19 nicklas 734       }
5390 29 Apr 19 nicklas 735     }
5390 29 Apr 19 nicklas 736     else
5390 29 Apr 19 nicklas 737     {
5390 29 Apr 19 nicklas 738       text = 'empty';
5390 29 Apr 19 nicklas 739     }
5390 29 Apr 19 nicklas 740
5390 29 Apr 19 nicklas 741     return text;
5390 29 Apr 19 nicklas 742   }
5390 29 Apr 19 nicklas 743   
5390 29 Apr 19 nicklas 744   return painter;
5390 29 Apr 19 nicklas 745 }();