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

Code
Comments
Other
Rev Date Author Line
5397 03 May 19 nicklas 1 var ImportPlates = function()
5397 03 May 19 nicklas 2 {
5397 03 May 19 nicklas 3   var mips = {};
5397 03 May 19 nicklas 4   var debug = 0;
5397 03 May 19 nicklas 5   
5397 03 May 19 nicklas 6   var prefixIsValid = false;
5397 03 May 19 nicklas 7   
5397 03 May 19 nicklas 8   var importData;
5397 03 May 19 nicklas 9   
5397 03 May 19 nicklas 10   // Page initialization
5397 03 May 19 nicklas 11   mips.initPage = function()
5397 03 May 19 nicklas 12   {
5397 03 May 19 nicklas 13     // Step 1
5397 03 May 19 nicklas 14     Events.addEventHandler('step-1', 'wizard-validate', mips.validateStep1);
5397 03 May 19 nicklas 15
5397 03 May 19 nicklas 16     Events.addEventHandler('prefix', 'change', mips.prefixOnChange);
5397 03 May 19 nicklas 17     Events.addEventHandler('prefix', 'keypress', Wizard.focusOnEnter);
5397 03 May 19 nicklas 18     Wizard.initFileSelectionField('importfile');
5397 03 May 19 nicklas 19     Events.addEventHandler('importfile', 'change', mips.importFileOnChange);
5397 03 May 19 nicklas 20     Events.addEventHandler('sheet', 'change', mips.worksheetOnChange);
5397 03 May 19 nicklas 21     
5397 03 May 19 nicklas 22     Events.addEventHandler('plateNames', 'change', mips.displayAliquotsOnPlate);
5397 03 May 19 nicklas 23     
5444 23 May 19 nicklas 24     Events.addEventHandler('pool-row', 'click', mips.togglePool);
5444 23 May 19 nicklas 25     Events.addEventHandler('pool-row', 'mouseover', mips.highlightPool);
5444 23 May 19 nicklas 26     Events.addEventHandler('pool-row', 'mouseout', mips.highlightPool);
5444 23 May 19 nicklas 27
5397 03 May 19 nicklas 28     // Navigation
5397 03 May 19 nicklas 29     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
5397 03 May 19 nicklas 30     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
5397 03 May 19 nicklas 31     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
5397 03 May 19 nicklas 32     Buttons.addClickHandler('goregister', Wizard.goRegister);
5397 03 May 19 nicklas 33     
5397 03 May 19 nicklas 34     // Final registration
5397 03 May 19 nicklas 35     Events.addEventHandler('wizard', 'wizard-submit', mips.submit);
5397 03 May 19 nicklas 36
5397 03 May 19 nicklas 37     Plate.init(8, 12, WellPainter);
5397 03 May 19 nicklas 38     Plate.paint(Plate.getWells());
5397 03 May 19 nicklas 39     window.addEventListener('beforeunload', mips.confirmLeaveWizard);
5526 25 Jun 19 nicklas 40     Wizard.keepSessionAlive();
5397 03 May 19 nicklas 41     
5397 03 May 19 nicklas 42     Doc.show('step-1');
5397 03 May 19 nicklas 43     Doc.show('gocancel');
5397 03 May 19 nicklas 44     Doc.show('goregister');
5397 03 May 19 nicklas 45     Events.sendChangeEvent('prefix');
5397 03 May 19 nicklas 46   }
5397 03 May 19 nicklas 47   
5397 03 May 19 nicklas 48   /**
5397 03 May 19 nicklas 49     Ask for confirmation to abort if DNA has been placed on the plate.
5397 03 May 19 nicklas 50   */
5397 03 May 19 nicklas 51   mips.confirmLeaveWizard = function(event)
5397 03 May 19 nicklas 52   {
5397 03 May 19 nicklas 53     if (Plate.getUsed().length > 0)
5397 03 May 19 nicklas 54     {
5397 03 May 19 nicklas 55       event.preventDefault();
5397 03 May 19 nicklas 56     }
5397 03 May 19 nicklas 57   }
5397 03 May 19 nicklas 58
5397 03 May 19 nicklas 59   mips.prefixOnChange = function()
5397 03 May 19 nicklas 60   {
5397 03 May 19 nicklas 61     var frm = document.forms['reggie'];
5397 03 May 19 nicklas 62     Wizard.setInputStatus('prefix');
5397 03 May 19 nicklas 63     
5397 03 May 19 nicklas 64     var prefix = frm.prefix.value.toUpperCase().replace(/_/g, '');
5397 03 May 19 nicklas 65     prefixIsValid = false;
5397 03 May 19 nicklas 66     if (prefix.length < 2)
5397 03 May 19 nicklas 67     {
5397 03 May 19 nicklas 68       Wizard.setInputStatus('prefix', 'invalid', 'The prefix should have at least 2 characters.');
5397 03 May 19 nicklas 69       frm.prefix.focus();
5397 03 May 19 nicklas 70       return;
5397 03 May 19 nicklas 71     }
5397 03 May 19 nicklas 72     
5397 03 May 19 nicklas 73     frm.prefix.value = prefix+'_';
5397 03 May 19 nicklas 74     Wizard.setInputStatus('prefix', 'valid');
5397 03 May 19 nicklas 75     prefixIsValid = true;
5397 03 May 19 nicklas 76     
5397 03 May 19 nicklas 77     mips.prevalidateImportFile();
5397 03 May 19 nicklas 78   }
5397 03 May 19 nicklas 79   
5397 03 May 19 nicklas 80   mips.importFileOnChange = function()
5397 03 May 19 nicklas 81   {
5397 03 May 19 nicklas 82     Doc.hide('worksheetSection');
5447 24 May 19 nicklas 83     Doc.hide('worksheetSection.help');
5397 03 May 19 nicklas 84     mips.prevalidateImportFile();
5397 03 May 19 nicklas 85   }
5397 03 May 19 nicklas 86   
5397 03 May 19 nicklas 87   mips.worksheetOnChange = function()
5397 03 May 19 nicklas 88   {
5397 03 May 19 nicklas 89     mips.prevalidateImportFile();
5397 03 May 19 nicklas 90   }
5397 03 May 19 nicklas 91   
5397 03 May 19 nicklas 92   mips.validateStep1 = function(event)
5397 03 May 19 nicklas 93   {
5399 06 May 19 nicklas 94     if (!prefixIsValid || !Wizard.isValid('importfile'))
5399 06 May 19 nicklas 95     {
5399 06 May 19 nicklas 96       event.preventDefault();
5399 06 May 19 nicklas 97     }
5397 03 May 19 nicklas 98   }
5397 03 May 19 nicklas 99
5397 03 May 19 nicklas 100   mips.prevalidateImportFile = function()
5397 03 May 19 nicklas 101   {
5397 03 May 19 nicklas 102     Doc.hide('platePreview');
5447 24 May 19 nicklas 103     Doc.hide('pool-row');
5401 07 May 19 nicklas 104     Wizard.hideWizardStatus();
5444 23 May 19 nicklas 105     Wizard.hideGoNextConfirmation();
5397 03 May 19 nicklas 106     
5397 03 May 19 nicklas 107     var frm = document.forms['reggie'];
5397 03 May 19 nicklas 108     var path = frm.importfile.value;
5397 03 May 19 nicklas 109     if (!prefixIsValid || path == '') return;
5397 03 May 19 nicklas 110     
5397 03 May 19 nicklas 111     Wizard.setInputStatus('importfile');
5397 03 May 19 nicklas 112     Data.set('importfile', 'valid', 0);
5397 03 May 19 nicklas 113
5397 03 May 19 nicklas 114     var url = '../Mips.servlet?ID='+App.getSessionId();
5397 03 May 19 nicklas 115     url += '&cmd=PreValidateImportFile';
5397 03 May 19 nicklas 116     url += '&path='+encodeURIComponent(path);
5397 03 May 19 nicklas 117     url += '&prefix='+encodeURIComponent(frm.prefix.value);
5397 03 May 19 nicklas 118     url += '&sheet='+encodeURIComponent(frm.sheet.value);
5397 03 May 19 nicklas 119     
5401 07 May 19 nicklas 120     Wizard.showLoadingAnimation('Validating ' + Strings.encodeTags(path));
5397 03 May 19 nicklas 121     Wizard.asyncJsonRequest(url, mips.onImportFileValidated, 'POST');
5397 03 May 19 nicklas 122   }
5397 03 May 19 nicklas 123
5397 03 May 19 nicklas 124   mips.onImportFileValidated = function(response)
5397 03 May 19 nicklas 125   {
5397 03 May 19 nicklas 126     var frm = document.forms['reggie'];
5397 03 May 19 nicklas 127
5397 03 May 19 nicklas 128     Wizard.setInputStatus('importfile');
5397 03 May 19 nicklas 129     Wizard.showFinalMessage(response.messages);
5397 03 May 19 nicklas 130     
5397 03 May 19 nicklas 131     importData = response.importFile;
5397 03 May 19 nicklas 132
5397 03 May 19 nicklas 133     var sheetNames = importData.sheetNames;
5397 03 May 19 nicklas 134     if (sheetNames && sheetNames.length)
5397 03 May 19 nicklas 135     {
5397 03 May 19 nicklas 136       var currentSheet = frm.sheet.value;
5397 03 May 19 nicklas 137       frm.sheet.length = 0;
5397 03 May 19 nicklas 138       for (var sNo = 0; sNo < sheetNames.length; sNo++)
5397 03 May 19 nicklas 139       {
5397 03 May 19 nicklas 140         var sheet = sheetNames[sNo];
5397 03 May 19 nicklas 141         frm.sheet[frm.sheet.length] = new Option(sheet, sheet, false, currentSheet == sheet);
5397 03 May 19 nicklas 142       }
5447 24 May 19 nicklas 143       if (frm.sheet.length > 1) 
5447 24 May 19 nicklas 144       {
5447 24 May 19 nicklas 145         Doc.show('worksheetSection');
5447 24 May 19 nicklas 146         Doc.show('worksheetSection.help');
5447 24 May 19 nicklas 147       }
5397 03 May 19 nicklas 148     }
5397 03 May 19 nicklas 149     
5397 03 May 19 nicklas 150     var plates = importData.plates;
5397 03 May 19 nicklas 151     frm.plateNames.length = 0;
5399 06 May 19 nicklas 152     
5397 03 May 19 nicklas 153     if (plates && plates.length)
5397 03 May 19 nicklas 154     {
5397 03 May 19 nicklas 155       for (var pNo = 0; pNo < plates.length; pNo++)
5397 03 May 19 nicklas 156       {
5397 03 May 19 nicklas 157         var plate = plates[pNo];
5399 06 May 19 nicklas 158         var text = plate.name;
5399 06 May 19 nicklas 159         if (plate.error) 
5399 06 May 19 nicklas 160         {
5399 06 May 19 nicklas 161           text += ' (' + plate.error + ')';
5399 06 May 19 nicklas 162         }
5399 06 May 19 nicklas 163         else
5399 06 May 19 nicklas 164         {
5399 06 May 19 nicklas 165           text += ' (' + plate.aliquots.length + ' aliquots)';
5399 06 May 19 nicklas 166         }
5399 06 May 19 nicklas 167         frm.plateNames[frm.plateNames.length] = new Option(text);
5397 03 May 19 nicklas 168       }
5397 03 May 19 nicklas 169     }
5397 03 May 19 nicklas 170     
5397 03 May 19 nicklas 171     if (importData.valid)
5397 03 May 19 nicklas 172     {
5397 03 May 19 nicklas 173       Wizard.setInputStatus('importfile', importData.warnings > 0 ? 'warning' : 'valid');
5397 03 May 19 nicklas 174       Data.set('importfile', 'valid', 1);
5444 23 May 19 nicklas 175       if (importData.warnings > 0)
5444 23 May 19 nicklas 176       {
5444 23 May 19 nicklas 177         Wizard.showGoNextConfirmation(true, 'Check to verify registration of plate with warnings.');
5444 23 May 19 nicklas 178       }
5397 03 May 19 nicklas 179     }
5397 03 May 19 nicklas 180     else
5397 03 May 19 nicklas 181     {
5397 03 May 19 nicklas 182       Wizard.setInputStatus('importfile', 'invalid');
5444 23 May 19 nicklas 183     }
5399 06 May 19 nicklas 184     
5403 08 May 19 nicklas 185     mips.displayAliquotsOnPlate();
5397 03 May 19 nicklas 186   }
5397 03 May 19 nicklas 187
5397 03 May 19 nicklas 188   mips.displayAliquotsOnPlate = function()
5397 03 May 19 nicklas 189   {
5403 08 May 19 nicklas 190     Doc.element('filename').innerHTML = Strings.encodeTags(importData.filename);
5403 08 May 19 nicklas 191     Doc.element('numPlates').innerHTML = importData.numPlates;
5403 08 May 19 nicklas 192     Doc.element('numAliquots').innerHTML = importData.numAliquots;
5403 08 May 19 nicklas 193     Doc.element('numErrors').innerHTML = importData.errors;
5403 08 May 19 nicklas 194     Doc.element('numWarnings').innerHTML = importData.warnings;
5403 08 May 19 nicklas 195     
5403 08 May 19 nicklas 196     Doc.element('importPossible').innerHTML = importData.valid ? '<img src="../images/ok.png">Import is possible!' : '<img src="../images/error.png">Import is not possible!';
5403 08 May 19 nicklas 197     
5397 03 May 19 nicklas 198     Doc.show('platePreview');
5397 03 May 19 nicklas 199     var frm = document.forms['reggie'];
5397 03 May 19 nicklas 200     var plateIndex = frm.plateNames.selectedIndex;
5397 03 May 19 nicklas 201     
5397 03 May 19 nicklas 202     var wells = Plate.getWells();
5397 03 May 19 nicklas 203     Plate.clear(wells);
5518 20 Jun 19 nicklas 204     MipsColor.reset();
5447 24 May 19 nicklas 205     COLUMN_CLASSES = new Array(Plate.columns);
5447 24 May 19 nicklas 206     
5403 08 May 19 nicklas 207     if (plateIndex >= 0 && importData.plates.length > plateIndex)
5397 03 May 19 nicklas 208     {
5403 08 May 19 nicklas 209       var plate = importData.plates[plateIndex];
5403 08 May 19 nicklas 210       var aliquots = plate.aliquots;
5403 08 May 19 nicklas 211       for (var aNo = 0; aNo < aliquots.length; aNo++)
5399 06 May 19 nicklas 212       {
5403 08 May 19 nicklas 213         var aliquot = aliquots[aNo];
5403 08 May 19 nicklas 214         var well = Plate.getWellByLocation(aliquot.location);
5403 08 May 19 nicklas 215         if (well && !well.extract) 
5403 08 May 19 nicklas 216         {
5403 08 May 19 nicklas 217           if (plate.error && !aliquot.error) aliquot.error = plate.error;
5403 08 May 19 nicklas 218           well.setExtract(aliquot);
5403 08 May 19 nicklas 219         }
5399 06 May 19 nicklas 220       }
5444 23 May 19 nicklas 221       mips.buildPoolTableRow(plate);
5397 03 May 19 nicklas 222     }
5397 03 May 19 nicklas 223     Plate.paint(wells);
5397 03 May 19 nicklas 224   }
5397 03 May 19 nicklas 225   
5444 23 May 19 nicklas 226   mips.buildPoolTableRow = function(plate)
5444 23 May 19 nicklas 227   {
5444 23 May 19 nicklas 228     var html = '<th></th>';
5444 23 May 19 nicklas 229     var columns = plate.columns;
5600 13 Sep 19 nicklas 230     var pools = [];  // A 'pool' is a number of columns with the same MIPS_Panel
5444 23 May 19 nicklas 231     var currentPool = {};
5444 23 May 19 nicklas 232
5444 23 May 19 nicklas 233     var poolNum = -1;
5444 23 May 19 nicklas 234     for (var colNo = 0; colNo < columns.length; colNo++)
5444 23 May 19 nicklas 235     {
5444 23 May 19 nicklas 236       var col = columns[colNo];
5600 13 Sep 19 nicklas 237       if (col.MIPS_Panel != currentPool.name)
5444 23 May 19 nicklas 238       {
5600 13 Sep 19 nicklas 239         // The column has a different MIPS_Panel than the previous one so we create a new pool
5444 23 May 19 nicklas 240         currentPool = {};
5600 13 Sep 19 nicklas 241         currentPool.name = col.MIPS_Panel;
5446 24 May 19 nicklas 242         currentPool.startCol = colNo;
5444 23 May 19 nicklas 243         currentPool.columnSpan = 1;
5600 13 Sep 19 nicklas 244         currentPool.hasMultipleMIPSPanels = col.hasMultipleMIPSPanels;
5447 24 May 19 nicklas 245         currentPool.hasMultiplePoolVolumes = col.hasMultiplePoolVolumes;
5444 23 May 19 nicklas 246         pools[pools.length] = currentPool;
5444 23 May 19 nicklas 247         poolNum++;
5444 23 May 19 nicklas 248       }
5444 23 May 19 nicklas 249       else if (currentPool)
5444 23 May 19 nicklas 250       {
5600 13 Sep 19 nicklas 251         // The column has the same MIPS_Panel as the previous one, we make the pool span across multiple columns
5444 23 May 19 nicklas 252         currentPool.columnSpan++;
5600 13 Sep 19 nicklas 253         if (col.hasMultipleMIPSPanels) currentPool.hasMultipleMIPSPanels = true;
5447 24 May 19 nicklas 254         if (col.hasMultiplePoolVolumes) currentPool.hasMultiplePoolVolumes = true;
5444 23 May 19 nicklas 255       }
5444 23 May 19 nicklas 256     }
5444 23 May 19 nicklas 257     
5444 23 May 19 nicklas 258     colNo = 0;
5444 23 May 19 nicklas 259     for (var poolNo = 0; poolNo < pools.length; poolNo++)
5444 23 May 19 nicklas 260     {
5444 23 May 19 nicklas 261       var pool = pools[poolNo];
5444 23 May 19 nicklas 262       var poolClass = 'pool link';
5444 23 May 19 nicklas 263       var poolText = null;
5444 23 May 19 nicklas 264       
5444 23 May 19 nicklas 265       if (pool.columnSpan == 1)
5444 23 May 19 nicklas 266       {
5444 23 May 19 nicklas 267         COLUMN_CLASSES[colNo] = 'pool-left pool-right';
5444 23 May 19 nicklas 268       }
5444 23 May 19 nicklas 269       else
5444 23 May 19 nicklas 270       {
5444 23 May 19 nicklas 271         COLUMN_CLASSES[colNo] = 'pool-left';
5444 23 May 19 nicklas 272         for (var i = 1; i < pool.columnSpan-1; i++)
5444 23 May 19 nicklas 273         {
5444 23 May 19 nicklas 274           COLUMN_CLASSES[colNo+i] = 'pool-middle';
5444 23 May 19 nicklas 275         }
5444 23 May 19 nicklas 276         COLUMN_CLASSES[colNo+pool.columnSpan-1] = 'pool-right';
5444 23 May 19 nicklas 277       }
5444 23 May 19 nicklas 278
5444 23 May 19 nicklas 279       if (pool.name)
5444 23 May 19 nicklas 280       {
5518 20 Jun 19 nicklas 281         if (pool.hasMultiplePoolVolumes) 
5444 23 May 19 nicklas 282         {
5444 23 May 19 nicklas 283           poolClass += ' pool-warning';
5518 20 Jun 19 nicklas 284           poolText = 'Some aliquots have a different pool volume!';
5444 23 May 19 nicklas 285         }
5518 20 Jun 19 nicklas 286         poolClass += ' ' + MipsColor.getColor(pool.name);
5444 23 May 19 nicklas 287         html += '<th id="pool.' + poolNo + '" colspan="'+pool.columnSpan+'"';
5444 23 May 19 nicklas 288         html += ' class="'+poolClass+'"';
5446 24 May 19 nicklas 289         html += ' data-start-col="' + pool.startCol + '"';
5446 24 May 19 nicklas 290         html += ' data-end-col="' + (pool.startCol+pool.columnSpan-1) + '"';
5444 23 May 19 nicklas 291         if (poolText) html += ' title="'+poolText+'"';
5444 23 May 19 nicklas 292         html += '>'+Strings.encodeTags(pool.name)+'</th>';
5444 23 May 19 nicklas 293       }
5444 23 May 19 nicklas 294       else
5444 23 May 19 nicklas 295       {
5444 23 May 19 nicklas 296         poolClass = '';
5444 23 May 19 nicklas 297         if (colNo > 0) poolClass += ' nopool-after-pool';
5444 23 May 19 nicklas 298         if (colNo + pool.columnSpan < 12) poolClass += ' nopool-before-pool';
5444 23 May 19 nicklas 299         html += '<th colspan="'+pool.columnSpan+'"';
5444 23 May 19 nicklas 300         html += ' class="'+poolClass+'"';
5444 23 May 19 nicklas 301         html += '></th>';
5444 23 May 19 nicklas 302       }
5444 23 May 19 nicklas 303       colNo += pool.columnSpan;
5444 23 May 19 nicklas 304     }
5444 23 May 19 nicklas 305     
5447 24 May 19 nicklas 306     Doc.element('pool-row').innerHTML = html;
5447 24 May 19 nicklas 307     Doc.show('pool-row');
5444 23 May 19 nicklas 308   }
5444 23 May 19 nicklas 309   
5400 06 May 19 nicklas 310   mips.submit = function()
5400 06 May 19 nicklas 311   {
5400 06 May 19 nicklas 312     var frm = document.forms['reggie'];
5400 06 May 19 nicklas 313     var path = frm.importfile.value;
5400 06 May 19 nicklas 314
5400 06 May 19 nicklas 315     var url = '../Mips.servlet?ID='+App.getSessionId();
5400 06 May 19 nicklas 316     url += '&cmd=ImportAliquotsFromFile';
5400 06 May 19 nicklas 317     url += '&path='+encodeURIComponent(path);
5400 06 May 19 nicklas 318     url += '&prefix='+encodeURIComponent(frm.prefix.value);
5400 06 May 19 nicklas 319     url += '&sheet='+encodeURIComponent(frm.sheet.value);
5400 06 May 19 nicklas 320     
5400 06 May 19 nicklas 321     Wizard.showLoadingAnimation('Performing registration...');
5400 06 May 19 nicklas 322     Wizard.asyncJsonRequest(url, mips.submissionResults, 'POST');
5400 06 May 19 nicklas 323   }
5400 06 May 19 nicklas 324   
5400 06 May 19 nicklas 325   mips.submissionResults = function(response)
5400 06 May 19 nicklas 326   {
5400 06 May 19 nicklas 327     window.removeEventListener('beforeunload', mips.confirmLeaveWizard);
5400 06 May 19 nicklas 328     Wizard.showFinalMessage(response.messages);
5400 06 May 19 nicklas 329     Doc.show('gorestart');
5400 06 May 19 nicklas 330   }
5400 06 May 19 nicklas 331
5397 03 May 19 nicklas 332   mips.initElements = function(element, autoInit)
5397 03 May 19 nicklas 333   {
5397 03 May 19 nicklas 334     if (autoInit == 'plate-col')
5397 03 May 19 nicklas 335     {
5397 03 May 19 nicklas 336       Events.addEventHandler(element, 'click', mips.toggleColumn);
5397 03 May 19 nicklas 337       Events.addEventHandler(element, 'mouseover', mips.highlightColumn);
5397 03 May 19 nicklas 338       Events.addEventHandler(element, 'mouseout', mips.highlightColumn);
5397 03 May 19 nicklas 339     }
5397 03 May 19 nicklas 340     else if (autoInit == 'plate-row')
5397 03 May 19 nicklas 341     {
5397 03 May 19 nicklas 342       Events.addEventHandler(element, 'click', mips.toggleRow);
5397 03 May 19 nicklas 343       Events.addEventHandler(element, 'mouseover', mips.highlightRow);
5397 03 May 19 nicklas 344       Events.addEventHandler(element, 'mouseout', mips.highlightRow);
5397 03 May 19 nicklas 345     }
5397 03 May 19 nicklas 346     else if (autoInit == 'plate-well')
5397 03 May 19 nicklas 347     {
5397 03 May 19 nicklas 348       Events.addEventHandler(element, 'click', mips.toggleWell);
5397 03 May 19 nicklas 349     }
5397 03 May 19 nicklas 350   }
5397 03 May 19 nicklas 351
5397 03 May 19 nicklas 352   // Toggle the selected status of a single well
5397 03 May 19 nicklas 353   mips.toggleWell = function(event)
5397 03 May 19 nicklas 354   {
5397 03 May 19 nicklas 355     var row = Data.int(event.currentTarget, 'row');
5397 03 May 19 nicklas 356     var column = Data.int(event.currentTarget, 'col');
5397 03 May 19 nicklas 357     var well = Plate.getWell(row, column);
5397 03 May 19 nicklas 358     Plate.toggleSelected([well]);
5397 03 May 19 nicklas 359   }
5397 03 May 19 nicklas 360
5397 03 May 19 nicklas 361   // Toggle the selected status of a complete row
5397 03 May 19 nicklas 362   mips.toggleRow = function(event)
5397 03 May 19 nicklas 363   {
5397 03 May 19 nicklas 364     var row = Data.int(event.currentTarget, 'row');
5397 03 May 19 nicklas 365     Plate.toggleSelected(Plate.getRow(row));
5397 03 May 19 nicklas 366   }
5397 03 May 19 nicklas 367
5397 03 May 19 nicklas 368   // Toggle the selected status of a complete column
5397 03 May 19 nicklas 369   mips.toggleColumn = function(event)
5397 03 May 19 nicklas 370   {
5397 03 May 19 nicklas 371     var column = Data.int(event.currentTarget, 'col');
5397 03 May 19 nicklas 372     Plate.toggleSelected(Plate.getColumn(column));
5397 03 May 19 nicklas 373   }
5397 03 May 19 nicklas 374   
5444 23 May 19 nicklas 375   // Toggle the selected status of a pool
5444 23 May 19 nicklas 376   mips.togglePool = function(event)
5444 23 May 19 nicklas 377   {
5446 24 May 19 nicklas 378     var startCol = Data.int(event.target, 'start-col');
5446 24 May 19 nicklas 379     var endCol = Data.int(event.target, 'end-col');
5446 24 May 19 nicklas 380     Plate.toggleSelected(Plate.getPool(startCol, endCol));
5444 23 May 19 nicklas 381   }
5444 23 May 19 nicklas 382   
5397 03 May 19 nicklas 383   // Highlight enable/disable all wells in a column
5397 03 May 19 nicklas 384   mips.highlightColumn = function(event)
5397 03 May 19 nicklas 385   {
5397 03 May 19 nicklas 386     var column = Data.int(event.currentTarget, 'col');
5397 03 May 19 nicklas 387     var on = event.type == 'mouseover';
5397 03 May 19 nicklas 388     
5397 03 May 19 nicklas 389     Doc.addOrRemoveClass(event.currentTarget, 'highlight-column', on);
5397 03 May 19 nicklas 390     var wells = Plate.getColumn(column);
5397 03 May 19 nicklas 391     Plate.setHighlight(wells, 'highlight-column', on);
5397 03 May 19 nicklas 392   }
5397 03 May 19 nicklas 393
5397 03 May 19 nicklas 394   // Highlight enable/disable all wells in a row
5397 03 May 19 nicklas 395   mips.highlightRow = function(event)
5397 03 May 19 nicklas 396   {
5397 03 May 19 nicklas 397     var row = Data.int(event.currentTarget, 'row');
5397 03 May 19 nicklas 398     var on = event.type == 'mouseover';
5397 03 May 19 nicklas 399     
5397 03 May 19 nicklas 400     Doc.addOrRemoveClass(event.currentTarget, 'highlight-row', on);
5397 03 May 19 nicklas 401     var wells = Plate.getRow(row);
5397 03 May 19 nicklas 402     Plate.setHighlight(wells, 'highlight-row', on);
5397 03 May 19 nicklas 403   }
5397 03 May 19 nicklas 404   
5444 23 May 19 nicklas 405   // Highligt enable/disable all wells in a pool
5444 23 May 19 nicklas 406   mips.highlightPool = function(event)
5444 23 May 19 nicklas 407   {
5446 24 May 19 nicklas 408     var startCol = Data.int(event.target, 'start-col');
5446 24 May 19 nicklas 409     var endCol = Data.int(event.target, 'end-col');
5444 23 May 19 nicklas 410     var on = event.type == 'mouseover';
5446 24 May 19 nicklas 411     Doc.addOrRemoveClass(event.target, 'highlight-pool', on);
5446 24 May 19 nicklas 412     var wells = Plate.getPool(startCol, endCol);
5446 24 May 19 nicklas 413     Plate.setHighlight(wells, 'highlight-pool', on);
5444 23 May 19 nicklas 414   }
5444 23 May 19 nicklas 415
5397 03 May 19 nicklas 416   return mips;
5397 03 May 19 nicklas 417 }();
5397 03 May 19 nicklas 418
5397 03 May 19 nicklas 419 Doc.onLoad(ImportPlates.initPage);
5397 03 May 19 nicklas 420 Doc.addElementInitializer(ImportPlates.initElements);
5397 03 May 19 nicklas 421
5444 23 May 19 nicklas 422 var COLUMN_CLASSES = [];
5397 03 May 19 nicklas 423 var WellPainter = function()
5397 03 May 19 nicklas 424 {
5397 03 May 19 nicklas 425   var painter = {};
5397 03 May 19 nicklas 426   
5397 03 May 19 nicklas 427   // Add class indicators for replicates and QC assigned wells
5397 03 May 19 nicklas 428   painter.getClassNameForWell = function(well)
5397 03 May 19 nicklas 429   {
5397 03 May 19 nicklas 430     var cls = '';
5397 03 May 19 nicklas 431     if (well.extract)
5397 03 May 19 nicklas 432     {
5436 17 May 19 nicklas 433       cls += ' primary';
5600 13 Sep 19 nicklas 434       if (well.extract.MIPS_Panel) cls += ' ' + MipsColor.getColor(well.extract.MIPS_Panel);
5397 03 May 19 nicklas 435     }
5444 23 May 19 nicklas 436     if (COLUMN_CLASSES[well.column]) cls += ' ' + COLUMN_CLASSES[well.column];
5397 03 May 19 nicklas 437     if (well.column == Plate.columns-1) cls += ' last-child';
5397 03 May 19 nicklas 438     return cls;
5397 03 May 19 nicklas 439   }
5397 03 May 19 nicklas 440   
5397 03 May 19 nicklas 441   painter.getWellText = function(well)
5397 03 May 19 nicklas 442   {
5397 03 May 19 nicklas 443     var text = '';
5397 03 May 19 nicklas 444     if (well.extract)
5397 03 May 19 nicklas 445     {
5397 03 May 19 nicklas 446       // The well contains DNA
5397 03 May 19 nicklas 447       var aliquot = well.extract;
5481 11 Jun 19 nicklas 448       text += '<div class="name">'+Reggie.softLineBreaks(Strings.encodeTags(aliquot.name || aliquot.prefix))+'</div>';
5397 03 May 19 nicklas 449       
5447 24 May 19 nicklas 450       if (aliquot.MIPS_PoolVolume != null)
5401 07 May 19 nicklas 451       {
5461 03 Jun 19 nicklas 452         text += '<div class="volume">'+Strings.encodeTags(aliquot.MIPS_PoolVolume)+'µl</div>';
5401 07 May 19 nicklas 453       }
5600 13 Sep 19 nicklas 454       if (aliquot.MIPS_Panel != null)
5402 07 May 19 nicklas 455       {
5600 13 Sep 19 nicklas 456         text += '<div class="mips-panel">'+Strings.encodeTags(aliquot.MIPS_Panel)+'</div>';
5402 07 May 19 nicklas 457       }
5447 24 May 19 nicklas 458
5447 24 May 19 nicklas 459       if (aliquot.MIPS_Form != null || aliquot.MIPS_NormalTumor != null)
5402 07 May 19 nicklas 460       {
5447 24 May 19 nicklas 461         text += '<div class="mips-form">';
5447 24 May 19 nicklas 462         if (aliquot.MIPS_NormalTumor != null) text += '<span>'+Strings.encodeTags(aliquot.MIPS_NormalTumor)+'</span>';
5447 24 May 19 nicklas 463         if (aliquot.MIPS_Form != null) text += '<span>'+Strings.encodeTags(aliquot.MIPS_Form)+'</span>';
5447 24 May 19 nicklas 464         text += '</div>';
5402 07 May 19 nicklas 465       }
5402 07 May 19 nicklas 466       
5397 03 May 19 nicklas 467       var warningMsg = [];
5397 03 May 19 nicklas 468       if (aliquot.comment)
5397 03 May 19 nicklas 469       {
5397 03 May 19 nicklas 470         text += '<div class="comment">'+Strings.encodeTags(aliquot.comment)+'</div>';
5397 03 May 19 nicklas 471       }
5397 03 May 19 nicklas 472       if (warningMsg.length > 0)
5397 03 May 19 nicklas 473       {
5397 03 May 19 nicklas 474         well.setWarning(warningMsg.join('; '));
5397 03 May 19 nicklas 475       }
5397 03 May 19 nicklas 476     }
5397 03 May 19 nicklas 477     else
5397 03 May 19 nicklas 478     {
5397 03 May 19 nicklas 479       text = 'empty';
5397 03 May 19 nicklas 480     }
5397 03 May 19 nicklas 481
5397 03 May 19 nicklas 482     return text;
5397 03 May 19 nicklas 483   }
5397 03 May 19 nicklas 484   
5397 03 May 19 nicklas 485   return painter;
5397 03 May 19 nicklas 486 }();