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

Code
Comments
Other
Rev Date Author Line
3832 07 Apr 16 nicklas 1 var MINIMAL_RNA_VOLUME = 1.0; // µl
3832 07 Apr 16 nicklas 2 // Default initial volumes (can be overridden by protocols)
3832 07 Apr 16 nicklas 3 var TOTAL_VOLUME = 50; // µl
3832 07 Apr 16 nicklas 4 var QUANTITY_REGULAR = 0.5; // µg
3832 07 Apr 16 nicklas 5 var QUANTITY_QC = 0.6; // µg
3832 07 Apr 16 nicklas 6 var QUANTITY_MINIMAL = QUANTITY_REGULAR;
3832 07 Apr 16 nicklas 7
3832 07 Apr 16 nicklas 8
2803 14 Oct 14 nicklas 9 var SelectRna = function()
2803 14 Oct 14 nicklas 10 {
2803 14 Oct 14 nicklas 11   var selectrna = {};
5881 25 Mar 20 nicklas 12   var plateType = 'MRNA';
3645 03 Dec 15 nicklas 13   var autoDesign = 0;
3832 07 Apr 16 nicklas 14   var hasInitProtocols = false;
2803 14 Oct 14 nicklas 15   
2803 14 Oct 14 nicklas 16   var EXTERNAL_RNA_NAME = 'External.r';
2853 23 Oct 14 nicklas 17   var debug = 0;
2803 14 Oct 14 nicklas 18   
2803 14 Oct 14 nicklas 19   var graphics;
2803 14 Oct 14 nicklas 20   var pen;
2803 14 Oct 14 nicklas 21   
2803 14 Oct 14 nicklas 22   var subtypeRna;
5884 27 Mar 20 nicklas 23   var subtypeRnaNormalized;
5884 27 Mar 20 nicklas 24   
5884 27 Mar 20 nicklas 25   var plateDefault;
5884 27 Mar 20 nicklas 26   var plateDefaults = {
5884 27 Mar 20 nicklas 27     'MRNA': 
5884 27 Mar 20 nicklas 28     {
5884 27 Mar 20 nicklas 29       'poolSchemaType': 'manual',
5884 27 Mar 20 nicklas 30       'poolSchema': '1by24offset'
5884 27 Mar 20 nicklas 31     },
5884 27 Mar 20 nicklas 32     'EXTERNAL_LIBRARY': 
5884 27 Mar 20 nicklas 33     {
5884 27 Mar 20 nicklas 34       'poolSchemaType': 'external',
5884 27 Mar 20 nicklas 35       'poolSchema': 'external32'
5884 27 Mar 20 nicklas 36     }
5884 27 Mar 20 nicklas 37   };
2803 14 Oct 14 nicklas 38
2803 14 Oct 14 nicklas 39   // Page initialization
2803 14 Oct 14 nicklas 40   selectrna.initPage = function()
2803 14 Oct 14 nicklas 41   {
3645 03 Dec 15 nicklas 42     autoDesign = Data.int('page-data', 'auto-design');
5881 25 Mar 20 nicklas 43     plateType = Data.get('page-data', 'plate-type');
5884 27 Mar 20 nicklas 44     plateDefault = plateDefaults[plateType] || plateDefaults['MRNA'];
3645 03 Dec 15 nicklas 45     
2803 14 Oct 14 nicklas 46     // Step 1
2803 14 Oct 14 nicklas 47     Events.addEventHandler('step-1', 'wizard-validate', selectrna.validateStep1);
2803 14 Oct 14 nicklas 48
2803 14 Oct 14 nicklas 49     Events.addEventHandler('pool_schema', 'change', selectrna.poolSchemaOnChange);
3832 07 Apr 16 nicklas 50     Events.addEventHandler('normalizationProtocol', 'change', selectrna.protocolOnChange);
2803 14 Oct 14 nicklas 51     
2803 14 Oct 14 nicklas 52     Events.addEventHandler('warning_quantity', 'change', selectrna.warningLevelOnChange);
2803 14 Oct 14 nicklas 53     Events.addEventHandler('warning_quality_score', 'change', selectrna.warningLevelOnChange);
2803 14 Oct 14 nicklas 54     Events.addEventHandler('warning_quantity', 'keypress', Events.numberOnly);
2803 14 Oct 14 nicklas 55     Events.addEventHandler('warning_quality_score', 'keypress', Events.numberOnly);
2803 14 Oct 14 nicklas 56     
2803 14 Oct 14 nicklas 57     Events.addEventHandler('location', 'click', selectrna.toggleInfo);
2803 14 Oct 14 nicklas 58     Events.addEventHandler('quantity', 'click', selectrna.toggleInfo);
2803 14 Oct 14 nicklas 59     Events.addEventHandler('quality-score', 'click', selectrna.toggleInfo);
6218 20 Apr 21 nicklas 60     Events.addEventHandler('conc', 'click', selectrna.toggleInfo);
2803 14 Oct 14 nicklas 61     Events.addEventHandler('volumes', 'click', selectrna.toggleInfo);
2803 14 Oct 14 nicklas 62     Events.addEventHandler('qiacube-date', 'click', selectrna.toggleInfo);
2803 14 Oct 14 nicklas 63     
2803 14 Oct 14 nicklas 64     Events.addEventHandler('pool-row', 'click', selectrna.togglePool);
2803 14 Oct 14 nicklas 65     Events.addEventHandler('pool-row', 'mouseover', selectrna.highlightPool);
2803 14 Oct 14 nicklas 66     Events.addEventHandler('pool-row', 'mouseout', selectrna.highlightPool);
2803 14 Oct 14 nicklas 67     
2803 14 Oct 14 nicklas 68     Buttons.addClickHandler('btnAutoSelect', selectrna.autoSelect);
2803 14 Oct 14 nicklas 69     Buttons.addClickHandler('btnManualSelect', selectrna.manualSelect);
2803 14 Oct 14 nicklas 70     Events.addEventHandler('plate', 'base-selected', selectrna.manuallySelected);
2803 14 Oct 14 nicklas 71     Buttons.addClickHandler('btnStratagene', selectrna.setToStratagene);
2803 14 Oct 14 nicklas 72     Buttons.addClickHandler('btnExternal', selectrna.setToExternal);
2803 14 Oct 14 nicklas 73     Buttons.addClickHandler('btnToggleQc', selectrna.toggleQc);
2803 14 Oct 14 nicklas 74     Buttons.addClickHandler('btnComment', selectrna.commentSelected);
2803 14 Oct 14 nicklas 75     Buttons.addClickHandler('btnCutSelected', selectrna.cutSelected);
2803 14 Oct 14 nicklas 76     Buttons.addClickHandler('btnCopySelected', selectrna.copySelected);
2803 14 Oct 14 nicklas 77     Buttons.addClickHandler('btnPasteToSelected', selectrna.pasteToSelected);
2803 14 Oct 14 nicklas 78     Buttons.addClickHandler('btnSwitch', selectrna.switchSelected);
2803 14 Oct 14 nicklas 79     
2803 14 Oct 14 nicklas 80     Events.addEventHandler('iconSpecialSelect', 'click', selectrna.toggleSpecialSelect);
2803 14 Oct 14 nicklas 81     Events.addEventHandler('plate', 'mouseup', selectrna.contextEvent);
2803 14 Oct 14 nicklas 82     Events.addEventHandler('plate', 'contextmenu', selectrna.contextEvent);
2803 14 Oct 14 nicklas 83     Events.addEventHandler('mnuComment', 'click', selectrna.commentSelected);
2803 14 Oct 14 nicklas 84     Events.addEventHandler('mnuToggleQc', 'click', selectrna.toggleQc);
2803 14 Oct 14 nicklas 85     Events.addEventHandler('mnuCutSelected', 'click', selectrna.cutSelected);
2803 14 Oct 14 nicklas 86     Events.addEventHandler('mnuCopySelected', 'click', selectrna.copySelected);
2803 14 Oct 14 nicklas 87     Events.addEventHandler('mnuPasteToSelected', 'click', selectrna.pasteToSelected);
2803 14 Oct 14 nicklas 88     Events.addEventHandler('mnuSwitch', 'click', selectrna.switchSelected);
2803 14 Oct 14 nicklas 89     Events.addEventHandler('mnuCaseSummary', 'click', selectrna.showCaseSummary);
2803 14 Oct 14 nicklas 90     Events.addEventHandler('mnuFlagLowQualityScore', 'click', selectrna.flagSelected);
2803 14 Oct 14 nicklas 91     Events.addEventHandler('mnuFlagNotEnoughRemainingQuantity', 'click', selectrna.flagSelected);
2803 14 Oct 14 nicklas 92     Events.addEventHandler('mnuFlagOther', 'click', selectrna.flagSelected);
2803 14 Oct 14 nicklas 93
2803 14 Oct 14 nicklas 94     Events.addEventHandler('flaggedRna', 'click', selectrna.showFlaggedRna);
2803 14 Oct 14 nicklas 95     
2803 14 Oct 14 nicklas 96     // Navigation
2803 14 Oct 14 nicklas 97     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
2803 14 Oct 14 nicklas 98     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2803 14 Oct 14 nicklas 99     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2803 14 Oct 14 nicklas 100     Buttons.addClickHandler('goregister', Wizard.goRegister);
2803 14 Oct 14 nicklas 101     
2803 14 Oct 14 nicklas 102     // Final registration
2803 14 Oct 14 nicklas 103     Events.addEventHandler('wizard', 'wizard-submit', selectrna.submit);
2803 14 Oct 14 nicklas 104     
5882 26 Mar 20 nicklas 105     Reggie.loadProtocols('RNA_NORMALIZATION_PROTOCOL', 'normalizationProtocol', 'LIBPREP_TARGET,RNA_TARGET_AMOUNT,RNA_MINIMAL_AMOUNT,RNA_TARGET_VOLUME', 'Manual');
3833 08 Apr 16 nicklas 106   }
3833 08 Apr 16 nicklas 107   
3833 08 Apr 16 nicklas 108   selectrna.initProtocols = function()
3833 08 Apr 16 nicklas 109   {
3833 08 Apr 16 nicklas 110     var frm = document.forms['reggie'];
3833 08 Apr 16 nicklas 111     hasInitProtocols = true;
2803 14 Oct 14 nicklas 112     
3833 08 Apr 16 nicklas 113     if (frm.normalizationProtocol.length == 0)
3833 08 Apr 16 nicklas 114     {
3833 08 Apr 16 nicklas 115       Wizard.setFatalError('No RNA dilution protocols found. Please ask the server administrator to create at least one protocol.');
3833 08 Apr 16 nicklas 116       return;
3833 08 Apr 16 nicklas 117     }
3833 08 Apr 16 nicklas 118     
3833 08 Apr 16 nicklas 119     for (var i=0; i < frm.normalizationProtocol.length; i++)
3833 08 Apr 16 nicklas 120     {
3833 08 Apr 16 nicklas 121       var p = frm.normalizationProtocol[i].item;
3833 08 Apr 16 nicklas 122       
3833 08 Apr 16 nicklas 123       var unit = 'µg';
3833 08 Apr 16 nicklas 124       var factor = 1;
3833 08 Apr 16 nicklas 125       if (p.RNATargetAmount < 0.5)
3833 08 Apr 16 nicklas 126       {
3833 08 Apr 16 nicklas 127         unit = 'ng';
3833 08 Apr 16 nicklas 128         factor = 1000;
3833 08 Apr 16 nicklas 129       }
3833 08 Apr 16 nicklas 130       
3833 08 Apr 16 nicklas 131       var text = p.name + ' (';
3833 08 Apr 16 nicklas 132       if (p.RNAMinimalAmount) text += Reggie.formatNumber(p.RNAMinimalAmount * factor, '', 1) + '-';
3833 08 Apr 16 nicklas 133       text += p.RNATargetAmount ? Reggie.formatNumber(p.RNATargetAmount * factor, '', 1) : '? ';
3833 08 Apr 16 nicklas 134       text += unit;
3833 08 Apr 16 nicklas 135       text += ' in '+(p.RNATargetVolume || '? ')+'µl)';
3833 08 Apr 16 nicklas 136       frm.normalizationProtocol[i].text = text;
3833 08 Apr 16 nicklas 137     }
3833 08 Apr 16 nicklas 138     
3833 08 Apr 16 nicklas 139     if (autoDesign) frm.normalizationProtocol.disabled = true;
3832 07 Apr 16 nicklas 140
2803 14 Oct 14 nicklas 141     var url = '../MRna.servlet?ID='+App.getSessionId();
3288 30 Apr 15 nicklas 142     url += '&cmd=GetNextAutoGeneratedPlateName';
5881 25 Mar 20 nicklas 143     url += '&bioPlateType='+ encodeURIComponent(plateType);
5882 26 Mar 20 nicklas 144     Wizard.showLoadingAnimation('Loading next plate name');
2803 14 Oct 14 nicklas 145     Wizard.asyncJsonRequest(url, selectrna.nextPlateNameLoaded);
3645 03 Dec 15 nicklas 146   }
3645 03 Dec 15 nicklas 147   
3645 03 Dec 15 nicklas 148   selectrna.nextPlateNameLoaded = function(response)
3645 03 Dec 15 nicklas 149   {
3645 03 Dec 15 nicklas 150     Plate.name = response.name;
3645 03 Dec 15 nicklas 151     Doc.element('plateName').innerHTML = Strings.encodeTags(Plate.name);
3645 03 Dec 15 nicklas 152
3645 03 Dec 15 nicklas 153     var url = '../MRna.servlet?ID='+App.getSessionId();
3645 03 Dec 15 nicklas 154     url += '&cmd=GetStratagene';
3645 03 Dec 15 nicklas 155     Wizard.asyncJsonRequest(url, selectrna.stratageneLoaded);
3645 03 Dec 15 nicklas 156   }
3645 03 Dec 15 nicklas 157
3833 08 Apr 16 nicklas 158   
3645 03 Dec 15 nicklas 159   selectrna.stratageneLoaded = function(response)
3645 03 Dec 15 nicklas 160   {
3645 03 Dec 15 nicklas 161     var frm = document.forms['reggie'];
3645 03 Dec 15 nicklas 162     var stratagene = response.stratagene;
3645 03 Dec 15 nicklas 163
3645 03 Dec 15 nicklas 164     for (var i = 0; i < stratagene.length; i++)
3645 03 Dec 15 nicklas 165     {
3645 03 Dec 15 nicklas 166       var s = stratagene[i];
3645 03 Dec 15 nicklas 167       var name = s.name;
3645 03 Dec 15 nicklas 168       if (s.bioWell)
3645 03 Dec 15 nicklas 169       {
3645 03 Dec 15 nicklas 170         name += ' -- ' + s.bioWell.bioPlate.name + ' ('+s.bioWell.location + ')';
3645 03 Dec 15 nicklas 171       }
3645 03 Dec 15 nicklas 172       frm.stratagene[frm.stratagene.length] = new Option(name, s.name);
3645 03 Dec 15 nicklas 173     }
3833 08 Apr 16 nicklas 174     
3832 07 Apr 16 nicklas 175     //selectrna.quantityOnChange();
3300 04 May 15 nicklas 176     selectrna.warningLevelOnChange();    
3290 30 Apr 15 nicklas 177     
3290 30 Apr 15 nicklas 178     // Init plate, pool schema and barcode variants
3290 30 Apr 15 nicklas 179     graphics = new jsGraphics(Doc.element('canvas'));
3290 30 Apr 15 nicklas 180     pen = new jsPen(new jsColor('#2288AA'), 2);
5882 26 Mar 20 nicklas 181     var columns = 12;
3290 30 Apr 15 nicklas 182     var rows = 8;
5884 27 Mar 20 nicklas 183     var schema = PoolSchema.initList(frm.pool_schema, plateDefault.poolSchema, plateDefault.poolSchemaType);
3290 30 Apr 15 nicklas 184     Plate.init(rows, columns, schema, WellPainter);
3290 30 Apr 15 nicklas 185     Events.sendChangeEvent(frm.pool_schema);
3645 03 Dec 15 nicklas 186     
3645 03 Dec 15 nicklas 187     if (autoDesign)
3645 03 Dec 15 nicklas 188     {
3645 03 Dec 15 nicklas 189       frm.pool_schema.disabled = true;
3645 03 Dec 15 nicklas 190       var wells = Plate.getPool(0);
3645 03 Dec 15 nicklas 191
3645 03 Dec 15 nicklas 192       var url = '../MRna.servlet?ID='+App.getSessionId();
3645 03 Dec 15 nicklas 193       url += '&cmd=GetRNAForAutoDesign&numToSelect='+wells.length;
3833 08 Apr 16 nicklas 194       url += '&protocol='+frm.normalizationProtocol.value;
3645 03 Dec 15 nicklas 195       Wizard.showLoadingAnimation('Finding RNA. Please wait...');
3645 03 Dec 15 nicklas 196       Wizard.asyncJsonRequest(url, selectrna.rnaAutoDesignSelected);
3645 03 Dec 15 nicklas 197     }
3645 03 Dec 15 nicklas 198     else
3645 03 Dec 15 nicklas 199     {
3645 03 Dec 15 nicklas 200       selectrna.step1IsInitialized();
3645 03 Dec 15 nicklas 201     }
2803 14 Oct 14 nicklas 202   }
3300 04 May 15 nicklas 203   
3645 03 Dec 15 nicklas 204   
3645 03 Dec 15 nicklas 205   selectrna.rnaAutoDesignSelected = function(response)
2803 14 Oct 14 nicklas 206   {
3645 03 Dec 15 nicklas 207     var rna = response.rna;
3645 03 Dec 15 nicklas 208     if (rna.length == 0)
3645 03 Dec 15 nicklas 209     {
3645 03 Dec 15 nicklas 210       Doc.addClass('btnOk', 'disabled');
3645 03 Dec 15 nicklas 211       Wizard.setFatalError('Could not find any unprocessed RNA at this time.');
3645 03 Dec 15 nicklas 212       return;
3645 03 Dec 15 nicklas 213     }
3645 03 Dec 15 nicklas 214     var wells = Plate.getPool(0);
3645 03 Dec 15 nicklas 215     Plate.setSelected(wells, true);
3645 03 Dec 15 nicklas 216     selectrna.rnaSelected(response);
3645 03 Dec 15 nicklas 217     Plate.setSelected(wells, false);
2803 14 Oct 14 nicklas 218
3645 03 Dec 15 nicklas 219     selectrna.step1IsInitialized();
3645 03 Dec 15 nicklas 220   }
3645 03 Dec 15 nicklas 221
3645 03 Dec 15 nicklas 222   selectrna.step1IsInitialized = function()
3645 03 Dec 15 nicklas 223   {
3645 03 Dec 15 nicklas 224     Doc.show('step-1');
3645 03 Dec 15 nicklas 225     Doc.show('gocancel');
3645 03 Dec 15 nicklas 226     Doc.show('goregister');
3645 03 Dec 15 nicklas 227     if (!autoDesign)
2803 14 Oct 14 nicklas 228     {
3645 03 Dec 15 nicklas 229       window.addEventListener('beforeunload', selectrna.confirmLeaveWizard);
3645 03 Dec 15 nicklas 230       Wizard.keepSessionAlive();
2803 14 Oct 14 nicklas 231     }
2803 14 Oct 14 nicklas 232   }
2803 14 Oct 14 nicklas 233
3645 03 Dec 15 nicklas 234   /**
3645 03 Dec 15 nicklas 235     Ask for confirmation to abort if RNA has been placed on the plate.
3645 03 Dec 15 nicklas 236     Only enabled in manual design.
3645 03 Dec 15 nicklas 237   */
3645 03 Dec 15 nicklas 238   selectrna.confirmLeaveWizard = function(event)
2803 14 Oct 14 nicklas 239   {
3645 03 Dec 15 nicklas 240     if (Plate.getUsed().length > 0)
3645 03 Dec 15 nicklas 241     {
3645 03 Dec 15 nicklas 242       event.preventDefault();
3645 03 Dec 15 nicklas 243     }
2803 14 Oct 14 nicklas 244   }
2803 14 Oct 14 nicklas 245   
3832 07 Apr 16 nicklas 246   selectrna.protocolOnChange = function()
2803 14 Oct 14 nicklas 247   {
2803 14 Oct 14 nicklas 248     var frm = document.forms['reggie'];
3833 08 Apr 16 nicklas 249     if (!hasInitProtocols) selectrna.initProtocols();
3832 07 Apr 16 nicklas 250
3832 07 Apr 16 nicklas 251     var protocol = frm.normalizationProtocol[frm.normalizationProtocol.selectedIndex].item;
3832 07 Apr 16 nicklas 252     if (!protocol || !protocol.RNATargetAmount || !protocol.RNATargetVolume)
2803 14 Oct 14 nicklas 253     {
3832 07 Apr 16 nicklas 254       protocol = {};
3832 07 Apr 16 nicklas 255       if (!protocol.RNATargetAmount) protocol.RNATargetAmount = 1.1;
3832 07 Apr 16 nicklas 256       if (!protocol.RNATargetVolume) protocol.RNATargetVolume = 50;
3832 07 Apr 16 nicklas 257       
3832 07 Apr 16 nicklas 258       var msg = 'Missing normalization data; assuming ';
3832 07 Apr 16 nicklas 259       msg += protocol.RNATargetAmount+ 'µg in '+protocol.RNATargetVolume+'µl.';
3832 07 Apr 16 nicklas 260       Wizard.setInputStatus('normalizationProtocol', 'warning',  msg);
2803 14 Oct 14 nicklas 261     }
3832 07 Apr 16 nicklas 262     else
3832 07 Apr 16 nicklas 263     {
3832 07 Apr 16 nicklas 264       Wizard.setInputStatus('normalizationProtocol', 'valid');
3832 07 Apr 16 nicklas 265     }
3832 07 Apr 16 nicklas 266     if (!protocol.RNAMinimalAmount) protocol.RNAMinimalAmount = protocol.RNATargetAmount;
2803 14 Oct 14 nicklas 267     
3832 07 Apr 16 nicklas 268     QUANTITY_REGULAR = protocol.RNATargetAmount;
3832 07 Apr 16 nicklas 269     QUANTITY_QC = QUANTITY_REGULAR+0.12;
3832 07 Apr 16 nicklas 270     TOTAL_VOLUME = protocol.RNATargetVolume;
3832 07 Apr 16 nicklas 271     QUANTITY_MINIMAL = protocol.RNAMinimalAmount;
3832 07 Apr 16 nicklas 272     Plate.paint(Plate.getWells());
2803 14 Oct 14 nicklas 273   }
2803 14 Oct 14 nicklas 274
2803 14 Oct 14 nicklas 275   selectrna.warningLevelOnChange = function(event)
2803 14 Oct 14 nicklas 276   {
2803 14 Oct 14 nicklas 277     var frm = document.forms['reggie'];
2803 14 Oct 14 nicklas 278
2803 14 Oct 14 nicklas 279     var wQuantity = parseFloat(frm.warning_quantity.value);
2803 14 Oct 14 nicklas 280     if (!(wQuantity > 0))
2803 14 Oct 14 nicklas 281     {
2803 14 Oct 14 nicklas 282       Wizard.setInputStatus('warnings', 'invalid', 'Remaining quantity must be ≥ 0.');
2803 14 Oct 14 nicklas 283       return;
2803 14 Oct 14 nicklas 284     }
2803 14 Oct 14 nicklas 285     var wQualityScore = parseFloat(frm.warning_quality_score.value);
2803 14 Oct 14 nicklas 286     if (!(wQualityScore > 0))
2803 14 Oct 14 nicklas 287     {
2803 14 Oct 14 nicklas 288       Wizard.setInputStatus('warnings', 'invalid', 'RQS/RIN must be ≥ 0.');
2803 14 Oct 14 nicklas 289       return;
2803 14 Oct 14 nicklas 290     }
2803 14 Oct 14 nicklas 291     
2803 14 Oct 14 nicklas 292     LOW_QUANTITY_WARNING_LIMIT = wQuantity;
2803 14 Oct 14 nicklas 293     QUALITY_SCORE_WARNING_LIMIT = wQualityScore;
2803 14 Oct 14 nicklas 294     
2803 14 Oct 14 nicklas 295     Wizard.setInputStatus('warnings', 'valid');
3290 30 Apr 15 nicklas 296     if (event) Plate.paint(Plate.getWells());
2803 14 Oct 14 nicklas 297   }
2803 14 Oct 14 nicklas 298   
2803 14 Oct 14 nicklas 299   selectrna.poolSchemaOnChange = function()
2803 14 Oct 14 nicklas 300   {
2803 14 Oct 14 nicklas 301     var frm = document.forms['reggie'];
3289 30 Apr 15 nicklas 302     var schema = PoolSchema.getById(frm.pool_schema.value);
3290 30 Apr 15 nicklas 303     Plate.setPoolSchema(schema);
3290 30 Apr 15 nicklas 304     
5882 26 Mar 20 nicklas 305     PoolSchema.buildPoolTableRow(schema, Plate.columns, true);
2803 14 Oct 14 nicklas 306     Plate.paint(Plate.getWells());
2803 14 Oct 14 nicklas 307   }
2803 14 Oct 14 nicklas 308   
2803 14 Oct 14 nicklas 309   selectrna.toggleInfo = function(event)
2803 14 Oct 14 nicklas 310   {
2803 14 Oct 14 nicklas 311     var show = event.currentTarget.checked;
2803 14 Oct 14 nicklas 312     Doc.addOrRemoveClass('plate', 'hide-'+event.currentTarget.id, !show);
2803 14 Oct 14 nicklas 313   }
2803 14 Oct 14 nicklas 314
2803 14 Oct 14 nicklas 315   var currentSelected;
2808 15 Oct 14 nicklas 316   var names = [];
2803 14 Oct 14 nicklas 317   /**
2803 14 Oct 14 nicklas 318     Open a popup dialog for manual selection of RNA.
2803 14 Oct 14 nicklas 319   */
2803 14 Oct 14 nicklas 320   selectrna.manualSelect = function(event)
2803 14 Oct 14 nicklas 321   {
2803 14 Oct 14 nicklas 322     currentSelected = Plate.getSelected();
2803 14 Oct 14 nicklas 323     if (currentSelected.length == 0)
2803 14 Oct 14 nicklas 324     {
2803 14 Oct 14 nicklas 325       Forms.showNotification(event.currentTarget, 'Please select one or more wells were RNA should be placed.');
2803 14 Oct 14 nicklas 326       return;
2803 14 Oct 14 nicklas 327     }
2803 14 Oct 14 nicklas 328     
2803 14 Oct 14 nicklas 329     if (subtypeRna == null) subtypeRna = Reggie.getSubtypeInfo('RNA');
2906 07 Nov 14 nicklas 330     if (subtypeRnaNormalized == null) subtypeRnaNormalized = Reggie.getSubtypeInfo('RNA_NORMALIZED_ALIQUOT');
2803 14 Oct 14 nicklas 331   
2803 14 Oct 14 nicklas 332     var url = '&resetTemporary=1';
4517 01 Jun 17 nicklas 333     url += '&tmpfilter:INT:itemSubtype='+encodeURIComponent(subtypeRna.id+'|'+subtypeRnaNormalized.id);
2803 14 Oct 14 nicklas 334     url += '&tmpfilter:DATE:creationEvent.eventDate='+encodeURIComponent('<>');
3832 07 Apr 16 nicklas 335     url += '&tmpfilter:FLOAT:remainingQuantity='+encodeURIComponent('>='+QUANTITY_MINIMAL);
2803 14 Oct 14 nicklas 336     url += '&'+encodeURIComponent('tmpfilter:STRING:&childCreationEvents(event.bioMaterial.name)')+'='+encodeURIComponent('<>%.m');
2803 14 Oct 14 nicklas 337
2803 14 Oct 14 nicklas 338     Dialogs.selectItem('EXTRACT', 'plate', 1, url);
2803 14 Oct 14 nicklas 339   }
2803 14 Oct 14 nicklas 340
2803 14 Oct 14 nicklas 341   /**
2803 14 Oct 14 nicklas 342     Callback method for manual selection.
2803 14 Oct 14 nicklas 343   */
2803 14 Oct 14 nicklas 344   selectrna.manuallySelected = function(event)
2803 14 Oct 14 nicklas 345   {
2808 15 Oct 14 nicklas 346     names[names.length] = event.detail.name;
2808 15 Oct 14 nicklas 347     
2808 15 Oct 14 nicklas 348     if (event.detail.remaining == 0 && names.length > 0)
2803 14 Oct 14 nicklas 349     {
2808 15 Oct 14 nicklas 350       Rna.loadInfoByNames(names);
2808 15 Oct 14 nicklas 351       
2808 15 Oct 14 nicklas 352       for (var i = 0; i < names.length && i < currentSelected.length; i++)
2808 15 Oct 14 nicklas 353       {
2808 15 Oct 14 nicklas 354         var well = currentSelected[i];
2808 15 Oct 14 nicklas 355         var name = names[i];
2808 15 Oct 14 nicklas 356         
2808 15 Oct 14 nicklas 357         // Create a new RNA object
2808 15 Oct 14 nicklas 358         var rna = Rna.createByName(name);
2808 15 Oct 14 nicklas 359         Rna.unflag(rna);
2808 15 Oct 14 nicklas 360         well.setExtract(rna);
2808 15 Oct 14 nicklas 361         well.selected = false;
2808 15 Oct 14 nicklas 362       }
2808 15 Oct 14 nicklas 363       
2808 15 Oct 14 nicklas 364       Plate.checkReplicates();
2808 15 Oct 14 nicklas 365       Plate.paint(currentSelected);
2808 15 Oct 14 nicklas 366       selectrna.updateNumFlaggedRna();
2808 15 Oct 14 nicklas 367       names = [];
2803 14 Oct 14 nicklas 368     }
2803 14 Oct 14 nicklas 369   }
2803 14 Oct 14 nicklas 370
2803 14 Oct 14 nicklas 371   
2803 14 Oct 14 nicklas 372   /**
2803 14 Oct 14 nicklas 373     Let the wizard automatically select among unprocessed RNA items.
2803 14 Oct 14 nicklas 374   */  
2803 14 Oct 14 nicklas 375   selectrna.autoSelect = function(event)
2803 14 Oct 14 nicklas 376   {
2803 14 Oct 14 nicklas 377     var frm = document.forms['reggie'];
2803 14 Oct 14 nicklas 378     var wells = Plate.getWells();
2803 14 Oct 14 nicklas 379     var selected = [];
2803 14 Oct 14 nicklas 380     var ignore = [];
2803 14 Oct 14 nicklas 381     var notEmpty = 0;
2803 14 Oct 14 nicklas 382     
2803 14 Oct 14 nicklas 383     // Count selected and non-empty wells and keep track of RNA that is already present
2803 14 Oct 14 nicklas 384     for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 385     {
2803 14 Oct 14 nicklas 386       var well = wells[i];
2803 14 Oct 14 nicklas 387       if (well.selected) 
2803 14 Oct 14 nicklas 388       {
2803 14 Oct 14 nicklas 389         selected[selected.length] = well;
2803 14 Oct 14 nicklas 390         if (well.extract && !well.hasError()) notEmpty++;
2803 14 Oct 14 nicklas 391       }
2803 14 Oct 14 nicklas 392       if (well.extract && well.extract.id)
2803 14 Oct 14 nicklas 393       {
2803 14 Oct 14 nicklas 394         ignore[ignore.length] = well.extract.id;
2803 14 Oct 14 nicklas 395       }
2803 14 Oct 14 nicklas 396     }
2803 14 Oct 14 nicklas 397     // Ignore RNA already flagged
2803 14 Oct 14 nicklas 398     var flagged = Rna.getFlagged();
2803 14 Oct 14 nicklas 399     for (var i = 0; i < flagged.length; i++)
2803 14 Oct 14 nicklas 400     {
2803 14 Oct 14 nicklas 401       var rna = flagged[i];
2803 14 Oct 14 nicklas 402       if (rna.id) ignore[ignore.length] = rna.id;
2803 14 Oct 14 nicklas 403     }
2803 14 Oct 14 nicklas 404     
2803 14 Oct 14 nicklas 405     if (selected.length == 0)
2803 14 Oct 14 nicklas 406     {
2803 14 Oct 14 nicklas 407       Forms.showNotification(event.currentTarget, 'Please select one or more wells were RNA should be placed.');
2803 14 Oct 14 nicklas 408       return;
2803 14 Oct 14 nicklas 409     }
2803 14 Oct 14 nicklas 410       
2803 14 Oct 14 nicklas 411     if (notEmpty > 0)
2803 14 Oct 14 nicklas 412     {
2803 14 Oct 14 nicklas 413       if (!confirm('Replace RNA in ' + notEmpty + ' wells?'))
2803 14 Oct 14 nicklas 414       {
2803 14 Oct 14 nicklas 415         return;
2803 14 Oct 14 nicklas 416       }
2803 14 Oct 14 nicklas 417     }
2803 14 Oct 14 nicklas 418       
2803 14 Oct 14 nicklas 419     var url = 'auto_select_rna.jsp?ID='+App.getSessionId();
2803 14 Oct 14 nicklas 420     url += '&numToSelect='+selected.length;
3832 07 Apr 16 nicklas 421     url += '&protocol='+frm.normalizationProtocol.value;
4650 08 Jan 18 nicklas 422     url += '&quantity='+encodeURIComponent(QUANTITY_MINIMAL);
2803 14 Oct 14 nicklas 423     url += '&ignore='+ignore.join(',');
2803 14 Oct 14 nicklas 424     Dialogs.openPopup(url, 'AutoSelectRNA', 750, 500);
2803 14 Oct 14 nicklas 425   }
2803 14 Oct 14 nicklas 426   
2803 14 Oct 14 nicklas 427   selectrna.rnaSelected = function(response)
2803 14 Oct 14 nicklas 428   {
2803 14 Oct 14 nicklas 429     // Cache RNA information
2803 14 Oct 14 nicklas 430     Rna.cacheInfo(response.rna);
2803 14 Oct 14 nicklas 431     Rna.cacheInfo(response.flagged);
2808 15 Oct 14 nicklas 432     
2803 14 Oct 14 nicklas 433     selectrna.updateNumFlaggedRna();
2803 14 Oct 14 nicklas 434     var selected = Plate.getSelected();
2803 14 Oct 14 nicklas 435     
2803 14 Oct 14 nicklas 436     for (var i = 0; i < response.rna.length; i++)
2803 14 Oct 14 nicklas 437     {
2803 14 Oct 14 nicklas 438       if (i < selected.length)
2803 14 Oct 14 nicklas 439       {
2803 14 Oct 14 nicklas 440         var well = selected[i];
2803 14 Oct 14 nicklas 441         // Create a new RNA object
2803 14 Oct 14 nicklas 442         var rna = Rna.createByName(response.rna[i].name);
2803 14 Oct 14 nicklas 443         well.setExtract(rna);
2803 14 Oct 14 nicklas 444         well.selected = false;
2803 14 Oct 14 nicklas 445       }
2803 14 Oct 14 nicklas 446     }
2803 14 Oct 14 nicklas 447     
2803 14 Oct 14 nicklas 448     // Check for replicates on the whole plate and repaint it
2803 14 Oct 14 nicklas 449     Plate.checkReplicates(null, true);
2803 14 Oct 14 nicklas 450     Plate.paint(Plate.getWells());
2803 14 Oct 14 nicklas 451   }
2803 14 Oct 14 nicklas 452   
2803 14 Oct 14 nicklas 453   // Update the 'Flagged RNA' information
2803 14 Oct 14 nicklas 454   selectrna.updateNumFlaggedRna = function()
2803 14 Oct 14 nicklas 455   {
3759 19 Feb 16 nicklas 456     var flagged = Rna.getFlagged();
3759 19 Feb 16 nicklas 457     var numFlagged = flagged.length;
2803 14 Oct 14 nicklas 458     if (numFlagged > 0)
2803 14 Oct 14 nicklas 459     {
3759 19 Feb 16 nicklas 460       var numFlaggedYellow = 0;
3759 19 Feb 16 nicklas 461       for (var rnaNo = 0; rnaNo < numFlagged; rnaNo++)
3759 19 Feb 16 nicklas 462       {
3759 19 Feb 16 nicklas 463         var r = flagged[rnaNo];
3759 19 Feb 16 nicklas 464         if (r.specimen && r.specimen.YellowLabel != null) numFlaggedYellow++;
3759 19 Feb 16 nicklas 465       }
3759 19 Feb 16 nicklas 466       var msg = numFlagged + ' flagged RNA items.';
3759 19 Feb 16 nicklas 467       if (numFlaggedYellow > 0) 
3759 19 Feb 16 nicklas 468       {
3759 19 Feb 16 nicklas 469         msg += ' <img src="../images/yellow-label.png"> '+numFlaggedYellow + (numFlaggedYellow == 1?' is':' are')+ ' derived from YellowLabel specimen!';
3759 19 Feb 16 nicklas 470       }
3759 19 Feb 16 nicklas 471       Doc.element('flaggedRna').innerHTML = msg;
2803 14 Oct 14 nicklas 472       Doc.show('flaggedRna');
2803 14 Oct 14 nicklas 473     }
2803 14 Oct 14 nicklas 474     else
2803 14 Oct 14 nicklas 475     {
2803 14 Oct 14 nicklas 476       Doc.hide('flaggedRna');
2803 14 Oct 14 nicklas 477     }
2803 14 Oct 14 nicklas 478   }
2803 14 Oct 14 nicklas 479
2803 14 Oct 14 nicklas 480   /**
2803 14 Oct 14 nicklas 481     Add 'Stratagene' to the selected wells.
2803 14 Oct 14 nicklas 482   */
2803 14 Oct 14 nicklas 483   selectrna.setToStratagene = function(event)
2803 14 Oct 14 nicklas 484   {
2803 14 Oct 14 nicklas 485     var frm = document.forms['reggie'];
2803 14 Oct 14 nicklas 486     selectrna.setToSpecial(event, frm.stratagene.value, true);
2803 14 Oct 14 nicklas 487   }
2803 14 Oct 14 nicklas 488
2803 14 Oct 14 nicklas 489
2803 14 Oct 14 nicklas 490   /**
2803 14 Oct 14 nicklas 491     Add 'External RNA' to the selected wells.
2803 14 Oct 14 nicklas 492   */
2803 14 Oct 14 nicklas 493   selectrna.setToExternal = function(event)
2803 14 Oct 14 nicklas 494   {
2803 14 Oct 14 nicklas 495     selectrna.setToSpecial(event, EXTERNAL_RNA_NAME, false);  
2803 14 Oct 14 nicklas 496   }
2803 14 Oct 14 nicklas 497   
2803 14 Oct 14 nicklas 498   /**
2803 14 Oct 14 nicklas 499     Add special RNA to the selected wells.
2803 14 Oct 14 nicklas 500   */
2803 14 Oct 14 nicklas 501   selectrna.setToSpecial = function(event, specialName, qc)
2803 14 Oct 14 nicklas 502   {
2803 14 Oct 14 nicklas 503     var wells = Plate.getSelected();
2803 14 Oct 14 nicklas 504     
2803 14 Oct 14 nicklas 505     if (wells.length == 0)
2803 14 Oct 14 nicklas 506     {
2803 14 Oct 14 nicklas 507       Forms.showNotification(event.currentTarget, 'No wells have been selected');
2803 14 Oct 14 nicklas 508       return;
2803 14 Oct 14 nicklas 509     }
2803 14 Oct 14 nicklas 510     
2803 14 Oct 14 nicklas 511     // Count non-empty wells
2803 14 Oct 14 nicklas 512     var count = 0;
2803 14 Oct 14 nicklas 513     for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 514     {
2803 14 Oct 14 nicklas 515       var well = wells[i];
2803 14 Oct 14 nicklas 516       if (well.extract && !well.hasError()) count++;
2803 14 Oct 14 nicklas 517     }
2803 14 Oct 14 nicklas 518     
2803 14 Oct 14 nicklas 519     if (count > 0)
2803 14 Oct 14 nicklas 520     {
2803 14 Oct 14 nicklas 521       if (!confirm('Replace RNA in ' + count + ' wells with '+specialName+'?'))
2803 14 Oct 14 nicklas 522       {
2803 14 Oct 14 nicklas 523         return;
2803 14 Oct 14 nicklas 524       }
2803 14 Oct 14 nicklas 525     }
2803 14 Oct 14 nicklas 526     
2803 14 Oct 14 nicklas 527     var info = Rna.infoByName(specialName);
2803 14 Oct 14 nicklas 528     if (!info.id)
2803 14 Oct 14 nicklas 529     {
2803 14 Oct 14 nicklas 530       alert('Could not find any RNA with name=\''+specialName+'\'. Please check that it exists on the server.');
2803 14 Oct 14 nicklas 531       return;
2803 14 Oct 14 nicklas 532     }
2803 14 Oct 14 nicklas 533     
2803 14 Oct 14 nicklas 534     for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 535     {
2803 14 Oct 14 nicklas 536       var well = wells[i];
2803 14 Oct 14 nicklas 537       var rna = Rna.createByInfo(info);
2803 14 Oct 14 nicklas 538       rna.qc = qc;
2803 14 Oct 14 nicklas 539       well.setExtract(rna);
2803 14 Oct 14 nicklas 540       well.selected = false;
2803 14 Oct 14 nicklas 541     }
2803 14 Oct 14 nicklas 542     
2803 14 Oct 14 nicklas 543     Plate.paint(wells);
2803 14 Oct 14 nicklas 544     
2803 14 Oct 14 nicklas 545     // Check for replicated RNA if some have been replaced with Stratagene
2803 14 Oct 14 nicklas 546     if (count > 0) Plate.checkReplicates();
2803 14 Oct 14 nicklas 547   }
2803 14 Oct 14 nicklas 548   
2803 14 Oct 14 nicklas 549   /**
2803 14 Oct 14 nicklas 550     Toggle the QC flag for the selected wells. The first non-empty
2803 14 Oct 14 nicklas 551     well is toggled and the rest of the wells will use the same new QC
2803 14 Oct 14 nicklas 552     value.
2803 14 Oct 14 nicklas 553   */
2803 14 Oct 14 nicklas 554   selectrna.toggleQc = function(event)
2803 14 Oct 14 nicklas 555   {
2803 14 Oct 14 nicklas 556     var wells = Plate.getSelected();
2803 14 Oct 14 nicklas 557   
2803 14 Oct 14 nicklas 558     if (wells.length == 0) 
2803 14 Oct 14 nicklas 559     {
2803 14 Oct 14 nicklas 560       Forms.showNotification(event.currentTarget, 'No wells have been selected');
2803 14 Oct 14 nicklas 561       return;
2803 14 Oct 14 nicklas 562     }
2803 14 Oct 14 nicklas 563     
2803 14 Oct 14 nicklas 564     var gotQc = false;
2803 14 Oct 14 nicklas 565     var newQc;
2803 14 Oct 14 nicklas 566     var count = 0;
2803 14 Oct 14 nicklas 567     for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 568     {
2803 14 Oct 14 nicklas 569       var well = wells[i];
2803 14 Oct 14 nicklas 570       if (well.extract)
2803 14 Oct 14 nicklas 571       {
2803 14 Oct 14 nicklas 572         // Toggle QC flag for the first well with RNA, then use the same flag for the rest
2803 14 Oct 14 nicklas 573         if (!gotQc)
2803 14 Oct 14 nicklas 574         {
2803 14 Oct 14 nicklas 575           gotQc = true;
2803 14 Oct 14 nicklas 576           newQc = !well.extract.qc;
2803 14 Oct 14 nicklas 577         }
2803 14 Oct 14 nicklas 578         well.extract.qc = newQc;
2803 14 Oct 14 nicklas 579         count++;
2803 14 Oct 14 nicklas 580       }
2803 14 Oct 14 nicklas 581     }
2803 14 Oct 14 nicklas 582     
2803 14 Oct 14 nicklas 583     if (count == 0)
2803 14 Oct 14 nicklas 584     {
2803 14 Oct 14 nicklas 585       Forms.showNotification(event.currentTarget, 'None of the selected wells contain any RNA');
2803 14 Oct 14 nicklas 586     }
2803 14 Oct 14 nicklas 587     else
2803 14 Oct 14 nicklas 588     {
2803 14 Oct 14 nicklas 589       Plate.paint(wells);
2803 14 Oct 14 nicklas 590     }
2803 14 Oct 14 nicklas 591   }
2803 14 Oct 14 nicklas 592
2803 14 Oct 14 nicklas 593   // Set a comment on the selected wells
2803 14 Oct 14 nicklas 594   selectrna.commentSelected = function(event)
2803 14 Oct 14 nicklas 595   {
2803 14 Oct 14 nicklas 596     var wells = Plate.getSelected();
2803 14 Oct 14 nicklas 597     
2803 14 Oct 14 nicklas 598     if (wells.length == 0)
2803 14 Oct 14 nicklas 599     {
2803 14 Oct 14 nicklas 600       Forms.showNotification(event.currentTarget, 'No wells have been selected');
2803 14 Oct 14 nicklas 601       return;
2803 14 Oct 14 nicklas 602     }
2803 14 Oct 14 nicklas 603     
2803 14 Oct 14 nicklas 604     var count = 0;
2803 14 Oct 14 nicklas 605     var comment = '';
2803 14 Oct 14 nicklas 606     for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 607     {
2803 14 Oct 14 nicklas 608       var well = wells[i];
2803 14 Oct 14 nicklas 609       if (well.extract) 
2803 14 Oct 14 nicklas 610       {
2803 14 Oct 14 nicklas 611         count++;
2803 14 Oct 14 nicklas 612         if (well.extract.comment) comment = well.extract.comment;
2803 14 Oct 14 nicklas 613       }
2803 14 Oct 14 nicklas 614     }
2803 14 Oct 14 nicklas 615       
2803 14 Oct 14 nicklas 616     if (count == 0)
2803 14 Oct 14 nicklas 617     {
2803 14 Oct 14 nicklas 618       Forms.showNotification(event.currentTarget, 'None of the selected wells contain any RNA');
2803 14 Oct 14 nicklas 619       return;
2803 14 Oct 14 nicklas 620     }
2803 14 Oct 14 nicklas 621
2803 14 Oct 14 nicklas 622     comment = prompt('Comment', comment || '');
2803 14 Oct 14 nicklas 623     if (comment == null) return;
2803 14 Oct 14 nicklas 624     
2803 14 Oct 14 nicklas 625     if (comment == '') comment = null;
2803 14 Oct 14 nicklas 626     for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 627     {
2803 14 Oct 14 nicklas 628       var well = wells[i];
2803 14 Oct 14 nicklas 629       if (well.extract) well.extract.comment = comment;
2803 14 Oct 14 nicklas 630     }
2803 14 Oct 14 nicklas 631     Plate.paint(wells);
2803 14 Oct 14 nicklas 632   }
2803 14 Oct 14 nicklas 633
2803 14 Oct 14 nicklas 634   /**
2803 14 Oct 14 nicklas 635     Empty the selected wells from RNA. They can later be pasted again.
2803 14 Oct 14 nicklas 636   */
2803 14 Oct 14 nicklas 637   selectrna.cutSelected = function(event)
2803 14 Oct 14 nicklas 638   {
2803 14 Oct 14 nicklas 639     var wells = Plate.getSelected();
2803 14 Oct 14 nicklas 640     
2803 14 Oct 14 nicklas 641     if (wells.length == 0)
2803 14 Oct 14 nicklas 642     {
2803 14 Oct 14 nicklas 643       Forms.showNotification(event.currentTarget, 'No wells have been selected');
2803 14 Oct 14 nicklas 644       return;
2803 14 Oct 14 nicklas 645     }
2803 14 Oct 14 nicklas 646     
2803 14 Oct 14 nicklas 647     var count = 0;
2803 14 Oct 14 nicklas 648     var valid = 0;
2803 14 Oct 14 nicklas 649     for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 650     {
2803 14 Oct 14 nicklas 651       var well = wells[i];
2803 14 Oct 14 nicklas 652       if (well.extract) 
2803 14 Oct 14 nicklas 653       {
2803 14 Oct 14 nicklas 654         count++;
2803 14 Oct 14 nicklas 655         if (!well.hasError()) valid++;
2803 14 Oct 14 nicklas 656       }
2803 14 Oct 14 nicklas 657     }
2803 14 Oct 14 nicklas 658     
2803 14 Oct 14 nicklas 659     if (count == 0)
2803 14 Oct 14 nicklas 660     {
2803 14 Oct 14 nicklas 661       Forms.showNotification(event.currentTarget, 'None of the selected wells contain any RNA');
2803 14 Oct 14 nicklas 662       return;
2803 14 Oct 14 nicklas 663     }
2803 14 Oct 14 nicklas 664     
2803 14 Oct 14 nicklas 665     // Ask for confirmation before deleting from valid wells
2803 14 Oct 14 nicklas 666     if (valid > 0)
2803 14 Oct 14 nicklas 667     {
2803 14 Oct 14 nicklas 668       if (!confirm('Clear RNA from ' + count + ' of ' + wells.length + ' selected wells?'))
2803 14 Oct 14 nicklas 669       {
2803 14 Oct 14 nicklas 670         return;
2803 14 Oct 14 nicklas 671       }
2803 14 Oct 14 nicklas 672     }
2803 14 Oct 14 nicklas 673   
2803 14 Oct 14 nicklas 674     selectrna.copySelected();
2803 14 Oct 14 nicklas 675     for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 676     {
2803 14 Oct 14 nicklas 677       var well = wells[i];
2803 14 Oct 14 nicklas 678       well.setExtract(null);
2803 14 Oct 14 nicklas 679       well.selected = false;
2803 14 Oct 14 nicklas 680     }
2803 14 Oct 14 nicklas 681     Plate.paint(wells);
2803 14 Oct 14 nicklas 682     Plate.checkReplicates();
2803 14 Oct 14 nicklas 683   }
2803 14 Oct 14 nicklas 684   
2803 14 Oct 14 nicklas 685   var copy;
2803 14 Oct 14 nicklas 686   /**
2803 14 Oct 14 nicklas 687     Copy information about the selected wells. 
2803 14 Oct 14 nicklas 688   */
2803 14 Oct 14 nicklas 689   selectrna.copySelected = function(event)
2803 14 Oct 14 nicklas 690   {
2803 14 Oct 14 nicklas 691     // Clear existing wells in the copy
2803 14 Oct 14 nicklas 692     var repaint = [];
2803 14 Oct 14 nicklas 693     if (copy && copy.length > 0)
2803 14 Oct 14 nicklas 694     {
2803 14 Oct 14 nicklas 695       for (var i = 0; i < copy.length; i++)
2803 14 Oct 14 nicklas 696       {
2803 14 Oct 14 nicklas 697         var cp = copy[i];
2803 14 Oct 14 nicklas 698         cp.well.doneWithCopy();
2803 14 Oct 14 nicklas 699         repaint[repaint.length] = cp.well;
2803 14 Oct 14 nicklas 700       }
2803 14 Oct 14 nicklas 701     }
2803 14 Oct 14 nicklas 702     Plate.paint(repaint);
2803 14 Oct 14 nicklas 703     
2803 14 Oct 14 nicklas 704     // Place selected wells in the copy
2803 14 Oct 14 nicklas 705     var wells = Plate.getSelected();
2803 14 Oct 14 nicklas 706     copy = [];
2803 14 Oct 14 nicklas 707     for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 708     {
2803 14 Oct 14 nicklas 709       var well = wells[i];
2803 14 Oct 14 nicklas 710       copy[copy.length] = well.makeCopy();
2803 14 Oct 14 nicklas 711       well.selected = false;
2803 14 Oct 14 nicklas 712     }
2803 14 Oct 14 nicklas 713     Plate.paint(wells);
2803 14 Oct 14 nicklas 714   }
2803 14 Oct 14 nicklas 715   
2803 14 Oct 14 nicklas 716   /**
2803 14 Oct 14 nicklas 717     Paste information into the selected wells.
2803 14 Oct 14 nicklas 718   */
2803 14 Oct 14 nicklas 719   selectrna.pasteToSelected = function(event)
2803 14 Oct 14 nicklas 720   {
2803 14 Oct 14 nicklas 721     if (!copy || copy.length == 0) 
2803 14 Oct 14 nicklas 722     {
2803 14 Oct 14 nicklas 723       Forms.showNotification(event.currentTarget, 'Nothing to paste. Please cut or copy wells first.');
2803 14 Oct 14 nicklas 724       return;
2803 14 Oct 14 nicklas 725     }
2803 14 Oct 14 nicklas 726     
2803 14 Oct 14 nicklas 727     var wells = Plate.getSelected();
2803 14 Oct 14 nicklas 728     // Count non-empty and valid wells
2803 14 Oct 14 nicklas 729     var count = 0;
2803 14 Oct 14 nicklas 730     for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 731     {
2803 14 Oct 14 nicklas 732       var well = wells[i];
2803 14 Oct 14 nicklas 733       if (well.extract && !well.hasError()) count++;
2803 14 Oct 14 nicklas 734     }
2803 14 Oct 14 nicklas 735     
2803 14 Oct 14 nicklas 736     if (count > 0)
2803 14 Oct 14 nicklas 737     {
2803 14 Oct 14 nicklas 738       if (!confirm('Replace RNA in ' + count + ' wells with copy?'))
2803 14 Oct 14 nicklas 739       {
2803 14 Oct 14 nicklas 740         return;
2803 14 Oct 14 nicklas 741       }
2803 14 Oct 14 nicklas 742     }
2803 14 Oct 14 nicklas 743     
2803 14 Oct 14 nicklas 744     var wi = 0;
2803 14 Oct 14 nicklas 745     var ci = 0;
2803 14 Oct 14 nicklas 746     var copyEmpty;
2803 14 Oct 14 nicklas 747     var askIfEmpty = true;
2803 14 Oct 14 nicklas 748     var repaint = [];
2803 14 Oct 14 nicklas 749     
2803 14 Oct 14 nicklas 750     while (wi < wells.length && ci < copy.length)
2803 14 Oct 14 nicklas 751     {
2803 14 Oct 14 nicklas 752       var well = wells[wi];
2803 14 Oct 14 nicklas 753       var cp = copy[ci];
2803 14 Oct 14 nicklas 754       var rna = null;
2803 14 Oct 14 nicklas 755       cp.well.doneWithCopy();
2803 14 Oct 14 nicklas 756       repaint[repaint.length] = cp.well;
2803 14 Oct 14 nicklas 757       if (cp.name)
2803 14 Oct 14 nicklas 758       {
2803 14 Oct 14 nicklas 759         rna = Rna.createByName(cp.name);
2803 14 Oct 14 nicklas 760         rna.comment = cp.comment;
2803 14 Oct 14 nicklas 761       }
2803 14 Oct 14 nicklas 762       else
2803 14 Oct 14 nicklas 763       {
2803 14 Oct 14 nicklas 764         // The copy is from an empty well
2803 14 Oct 14 nicklas 765         if (askIfEmpty)
2803 14 Oct 14 nicklas 766         {
2803 14 Oct 14 nicklas 767           askIfEmpty = false;
2803 14 Oct 14 nicklas 768           copyEmpty = confirm('Do you want to copy empty wells? If not, only non-empty well are copied.');
2803 14 Oct 14 nicklas 769         }
2803 14 Oct 14 nicklas 770       }
2803 14 Oct 14 nicklas 771       if (rna != null || copyEmpty)
2803 14 Oct 14 nicklas 772       {
2803 14 Oct 14 nicklas 773         well.setExtract(rna);
2803 14 Oct 14 nicklas 774         well.selected = false;
2803 14 Oct 14 nicklas 775         repaint[repaint.length] = well;
2803 14 Oct 14 nicklas 776         wi++;
2803 14 Oct 14 nicklas 777       }
2803 14 Oct 14 nicklas 778       ci++;
2803 14 Oct 14 nicklas 779     }
2803 14 Oct 14 nicklas 780     Plate.paint(repaint);
2803 14 Oct 14 nicklas 781     copy.splice(0, ci);
2803 14 Oct 14 nicklas 782     Plate.checkReplicates();
2803 14 Oct 14 nicklas 783   }
2803 14 Oct 14 nicklas 784
2803 14 Oct 14 nicklas 785   /*
2803 14 Oct 14 nicklas 786     If exactly two wells have been selected, switch the RNA in them.
2803 14 Oct 14 nicklas 787   */
2803 14 Oct 14 nicklas 788   selectrna.switchSelected = function(event)
2803 14 Oct 14 nicklas 789   {
2803 14 Oct 14 nicklas 790     var wells = Plate.getSelected();
2803 14 Oct 14 nicklas 791   
2803 14 Oct 14 nicklas 792     if (wells.length != 2)
2803 14 Oct 14 nicklas 793     {
2803 14 Oct 14 nicklas 794       Forms.showNotification(event.currentTarget, 'Exactly 2 wells must be selected.');
2803 14 Oct 14 nicklas 795       return;
2803 14 Oct 14 nicklas 796     }
2803 14 Oct 14 nicklas 797   
2803 14 Oct 14 nicklas 798     var rna0 = wells[0].extract;
2803 14 Oct 14 nicklas 799     var rna1 = wells[1].extract;
2803 14 Oct 14 nicklas 800     
2803 14 Oct 14 nicklas 801     wells[0].setExtract(rna1);
2803 14 Oct 14 nicklas 802     wells[1].setExtract(rna0);
2803 14 Oct 14 nicklas 803     Plate.paint(wells);
2803 14 Oct 14 nicklas 804   }
2803 14 Oct 14 nicklas 805
2803 14 Oct 14 nicklas 806   // Toggle the 'special select' menu on and off
2803 14 Oct 14 nicklas 807   selectrna.toggleSpecialSelect = function(event)
2803 14 Oct 14 nicklas 808   {
2803 14 Oct 14 nicklas 809     var pos = Doc.getElementPosition('iconSpecialSelect');
2803 14 Oct 14 nicklas 810     Menu.toggleTopMenu('menuSpecialSelect', pos.left+pos.width/4, pos.top+pos.height); 
2803 14 Oct 14 nicklas 811     event.stopPropagation();
2803 14 Oct 14 nicklas 812   }
2803 14 Oct 14 nicklas 813   
2803 14 Oct 14 nicklas 814   var contextRNA = null;
2803 14 Oct 14 nicklas 815   var contextX;
2803 14 Oct 14 nicklas 816   var contextY;
2803 14 Oct 14 nicklas 817   /**
2803 14 Oct 14 nicklas 818     Reacts to 'mouseup' and 'contextmenu' events for the bioplate. 
2803 14 Oct 14 nicklas 819     This should bring up the cut/copy/paste context menu depending on which
2803 14 Oct 14 nicklas 820     mouse button that was clicked.
2803 14 Oct 14 nicklas 821   */
2803 14 Oct 14 nicklas 822   selectrna.contextEvent = function(event)
2803 14 Oct 14 nicklas 823   {
2803 14 Oct 14 nicklas 824     // Context menu on 'right' mouse button
2803 14 Oct 14 nicklas 825     // Can't just check the button since two events are sent ('mouseup' and 'contextmenu')
2803 14 Oct 14 nicklas 826     var showContext = event.type == 'contextmenu' && event.button == 2;
2803 14 Oct 14 nicklas 827       
2803 14 Oct 14 nicklas 828     if (showContext)
2803 14 Oct 14 nicklas 829     {
2803 14 Oct 14 nicklas 830       event.preventDefault(); // Prevents the default right-click menu from appearing
2803 14 Oct 14 nicklas 831       
2803 14 Oct 14 nicklas 832       // Get the well that is right-clicked and the RNA that is in it
2803 14 Oct 14 nicklas 833       contextRNA = null;
2803 14 Oct 14 nicklas 834       var well = event.target;
2803 14 Oct 14 nicklas 835       while (well && (!well.id || well.id.indexOf('well') != 0))
2803 14 Oct 14 nicklas 836       {
2803 14 Oct 14 nicklas 837         well = well.parentNode;
2803 14 Oct 14 nicklas 838       }
2803 14 Oct 14 nicklas 839       if (well)
2803 14 Oct 14 nicklas 840       {
2803 14 Oct 14 nicklas 841         var c = well.id.split(/\./);
2803 14 Oct 14 nicklas 842         contextRNA = Plate.getWell(parseInt(c[1]), parseInt(c[2])).extract;
2803 14 Oct 14 nicklas 843       }
2803 14 Oct 14 nicklas 844       // Update the context meny
2803 14 Oct 14 nicklas 845       var caseSummaryMenu = Doc.element('mnuCaseSummary');
2803 14 Oct 14 nicklas 846       if (contextRNA)
2803 14 Oct 14 nicklas 847       {
2803 14 Oct 14 nicklas 848         caseSummaryMenu.title = 'Show case summary for ' + Strings.encodeTags(contextRNA.name);
2803 14 Oct 14 nicklas 849         Doc.show('sepCaseSummary');
2803 14 Oct 14 nicklas 850         Doc.show('mnuCaseSummary');
2803 14 Oct 14 nicklas 851       }
2803 14 Oct 14 nicklas 852       else
2803 14 Oct 14 nicklas 853       {
2803 14 Oct 14 nicklas 854         Doc.hide('sepCaseSummary');
2803 14 Oct 14 nicklas 855         Doc.hide('mnuCaseSummary');
2803 14 Oct 14 nicklas 856       }
2803 14 Oct 14 nicklas 857       
2803 14 Oct 14 nicklas 858       var menu = Doc.element('menuContext');
2803 14 Oct 14 nicklas 859       // 1 pixel offset to avoid losing well focus outline
2803 14 Oct 14 nicklas 860       contextX = event.clientX+1;
2803 14 Oct 14 nicklas 861       contextY = event.clientY+1;
2803 14 Oct 14 nicklas 862       // Need short delay since 'mouseup' are also sent as 'click' events
2803 14 Oct 14 nicklas 863       // to the 'document' object which BASE already have a Menu.hideAll()
2803 14 Oct 14 nicklas 864       // call which would hide the menu immediately
2803 14 Oct 14 nicklas 865       setTimeout(selectrna.showContextMenu, 100);
2803 14 Oct 14 nicklas 866     }
2803 14 Oct 14 nicklas 867   }
2803 14 Oct 14 nicklas 868   
2803 14 Oct 14 nicklas 869   selectrna.showContextMenu = function()
2803 14 Oct 14 nicklas 870   {
2803 14 Oct 14 nicklas 871     Menu.showTopMenu('menuContext', contextX, contextY);
2803 14 Oct 14 nicklas 872   }
2803 14 Oct 14 nicklas 873
2803 14 Oct 14 nicklas 874   selectrna.showCaseSummary = function()
2803 14 Oct 14 nicklas 875   {
2803 14 Oct 14 nicklas 876     if (!contextRNA) return;
5019 10 Oct 18 nicklas 877     Reggie.openCaseSummaryPopup(contextRNA.name);
2803 14 Oct 14 nicklas 878   }
2803 14 Oct 14 nicklas 879   
2803 14 Oct 14 nicklas 880   selectrna.showFlaggedRna = function()
2803 14 Oct 14 nicklas 881   {
2803 14 Oct 14 nicklas 882     currentSelected = Plate.getSelected();
2803 14 Oct 14 nicklas 883     currentIndex = 0;
2803 14 Oct 14 nicklas 884
2803 14 Oct 14 nicklas 885     var flagged = Rna.getFlagged();
2803 14 Oct 14 nicklas 886     var url = 'show_flagged_rna.jsp?ID='+App.getSessionId();
2803 14 Oct 14 nicklas 887     url += '&numFlagged='+flagged.length;
2803 14 Oct 14 nicklas 888     url += '&numSelected='+currentSelected.length;
2803 14 Oct 14 nicklas 889     Dialogs.openPopup(url, 'FlaggedRna', 800, 500);
2803 14 Oct 14 nicklas 890   }
2803 14 Oct 14 nicklas 891
2803 14 Oct 14 nicklas 892   
2803 14 Oct 14 nicklas 893   //Flag the selected RNA
2803 14 Oct 14 nicklas 894   selectrna.flagSelected = function(event)
2803 14 Oct 14 nicklas 895   {
2803 14 Oct 14 nicklas 896     var flag = Data.get(event.currentTarget, 'flag');
2803 14 Oct 14 nicklas 897     var wells = Plate.getSelected();
2803 14 Oct 14 nicklas 898     
2803 14 Oct 14 nicklas 899     if (wells.length == 0)
2803 14 Oct 14 nicklas 900     {
2803 14 Oct 14 nicklas 901       Forms.showNotification(event.currentTarget, 'No wells have been selected.');
2803 14 Oct 14 nicklas 902       return;
2803 14 Oct 14 nicklas 903     }
2803 14 Oct 14 nicklas 904     
2803 14 Oct 14 nicklas 905     var comment = null;
2803 14 Oct 14 nicklas 906     if (flag == 'ManualFlag')
2803 14 Oct 14 nicklas 907     {
2803 14 Oct 14 nicklas 908       // Check if a comment has been set on any of the RNA
2803 14 Oct 14 nicklas 909       for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 910       {
2803 14 Oct 14 nicklas 911         var well = wells[i];
2803 14 Oct 14 nicklas 912         if (well.extract && well.extract.info) 
2803 14 Oct 14 nicklas 913         {
2803 14 Oct 14 nicklas 914           if (well.extract.info.comment) comment = well.extract.info.comment;
2803 14 Oct 14 nicklas 915         }
2803 14 Oct 14 nicklas 916       }
2803 14 Oct 14 nicklas 917       comment = prompt('Comment', comment || '');
2803 14 Oct 14 nicklas 918       if (!comment) return;
2803 14 Oct 14 nicklas 919     }
2803 14 Oct 14 nicklas 920     
2803 14 Oct 14 nicklas 921     var count = 0;
2803 14 Oct 14 nicklas 922     for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 923     {
2803 14 Oct 14 nicklas 924       var well = wells[i];
2803 14 Oct 14 nicklas 925       var rna = well.extract;
2803 14 Oct 14 nicklas 926       if (rna && !rna.stratagene && !rna.external)
2803 14 Oct 14 nicklas 927       {
2803 14 Oct 14 nicklas 928         Rna.flag(rna, flag);
2803 14 Oct 14 nicklas 929         rna.info.comment = comment;
2803 14 Oct 14 nicklas 930         well.setExtract(null);
2803 14 Oct 14 nicklas 931         count++;
2803 14 Oct 14 nicklas 932       }
2803 14 Oct 14 nicklas 933       well.selected = false;
2803 14 Oct 14 nicklas 934     }
2803 14 Oct 14 nicklas 935     
2803 14 Oct 14 nicklas 936     selectrna.updateNumFlaggedRna();
2803 14 Oct 14 nicklas 937     Plate.paint(wells);
2803 14 Oct 14 nicklas 938   }
2803 14 Oct 14 nicklas 939
2803 14 Oct 14 nicklas 940
2803 14 Oct 14 nicklas 941   selectrna.validateStep1 = function(event)
2803 14 Oct 14 nicklas 942   {
2803 14 Oct 14 nicklas 943     var frm = document.forms['reggie'];
2803 14 Oct 14 nicklas 944     var numErrors = 0;
2803 14 Oct 14 nicklas 945     var numWarnings = 0;
2803 14 Oct 14 nicklas 946     var numRna = 0;
2803 14 Oct 14 nicklas 947     var numStratagene = 0;
2803 14 Oct 14 nicklas 948     var numExternal = 0;
2803 14 Oct 14 nicklas 949     var wells = Plate.getWells();
3289 30 Apr 15 nicklas 950     var schema = PoolSchema.getById(frm.pool_schema.value);
2803 14 Oct 14 nicklas 951     for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 952     {
2803 14 Oct 14 nicklas 953       var well = wells[i];
2803 14 Oct 14 nicklas 954       var rna = well.extract;
2803 14 Oct 14 nicklas 955       if (well.hasWarning())
2803 14 Oct 14 nicklas 956       {
2803 14 Oct 14 nicklas 957         numWarnings++;
2803 14 Oct 14 nicklas 958       }
2803 14 Oct 14 nicklas 959       if (well.hasError())
2803 14 Oct 14 nicklas 960       {
2803 14 Oct 14 nicklas 961         numErrors++;
2803 14 Oct 14 nicklas 962       }
2803 14 Oct 14 nicklas 963       else
2803 14 Oct 14 nicklas 964       {
2803 14 Oct 14 nicklas 965         if (rna && rna.id) 
2803 14 Oct 14 nicklas 966         {
2803 14 Oct 14 nicklas 967           numRna++;
2803 14 Oct 14 nicklas 968           if (rna.stratagene) numStratagene++;
2803 14 Oct 14 nicklas 969           if (rna.external) numExternal++;
2803 14 Oct 14 nicklas 970         }
2803 14 Oct 14 nicklas 971       }
2803 14 Oct 14 nicklas 972     }
2803 14 Oct 14 nicklas 973
2803 14 Oct 14 nicklas 974     if (numErrors > 0)
2803 14 Oct 14 nicklas 975     {
2803 14 Oct 14 nicklas 976       event.preventDefault();
2803 14 Oct 14 nicklas 977       return;
2803 14 Oct 14 nicklas 978     }
2803 14 Oct 14 nicklas 979     
2803 14 Oct 14 nicklas 980     if (numRna == 0)
2803 14 Oct 14 nicklas 981     {
2803 14 Oct 14 nicklas 982       alert('There is no RNA in any wells');
2803 14 Oct 14 nicklas 983       event.preventDefault();
2803 14 Oct 14 nicklas 984       return;
2803 14 Oct 14 nicklas 985     }
2803 14 Oct 14 nicklas 986     
2803 14 Oct 14 nicklas 987     if (numWarnings > 0)
2803 14 Oct 14 nicklas 988     {
2803 14 Oct 14 nicklas 989       if (!confirm('There are ' + numWarnings + ' wells with a warning. Continue anyway?'))
2803 14 Oct 14 nicklas 990       {
2803 14 Oct 14 nicklas 991         event.preventDefault();
2803 14 Oct 14 nicklas 992         return;
2803 14 Oct 14 nicklas 993       }
2803 14 Oct 14 nicklas 994     }
2803 14 Oct 14 nicklas 995     
2803 14 Oct 14 nicklas 996     if (schema)
2803 14 Oct 14 nicklas 997     {
2803 14 Oct 14 nicklas 998       var numPrimary = schema.numPools * schema.numWellsPerPool;
2803 14 Oct 14 nicklas 999       if (numRna < numPrimary)
2803 14 Oct 14 nicklas 1000       {
2803 14 Oct 14 nicklas 1001         if (!confirm((numPrimary-numRna)+ ' primary wells are missing RNA. Continue anyway?'))
2803 14 Oct 14 nicklas 1002         {
2803 14 Oct 14 nicklas 1003           event.preventDefault();
2803 14 Oct 14 nicklas 1004           return;
2803 14 Oct 14 nicklas 1005         }
2803 14 Oct 14 nicklas 1006       }
2803 14 Oct 14 nicklas 1007     }
2803 14 Oct 14 nicklas 1008     
2803 14 Oct 14 nicklas 1009     if (numRna == numStratagene+numExternal)
2803 14 Oct 14 nicklas 1010     {
2803 14 Oct 14 nicklas 1011       if (!confirm('There are only wells with Stratagene or external RNA on this plate. Continue anyway?'))
2803 14 Oct 14 nicklas 1012       {
2803 14 Oct 14 nicklas 1013         event.preventDefault();
2803 14 Oct 14 nicklas 1014         return;
2803 14 Oct 14 nicklas 1015       }
2803 14 Oct 14 nicklas 1016     }
2803 14 Oct 14 nicklas 1017     
2803 14 Oct 14 nicklas 1018   }
2803 14 Oct 14 nicklas 1019   
2803 14 Oct 14 nicklas 1020   selectrna.submit = function()
2803 14 Oct 14 nicklas 1021   {
2803 14 Oct 14 nicklas 1022     var frm = document.forms['reggie'];
2803 14 Oct 14 nicklas 1023
2803 14 Oct 14 nicklas 1024     var submitInfo = {};
2803 14 Oct 14 nicklas 1025     var plateInfo = {};
2803 14 Oct 14 nicklas 1026     var flaggedRnaInfo = [];
2803 14 Oct 14 nicklas 1027     
5891 07 Apr 20 nicklas 1028     submitInfo.normalizationProtocol = parseInt(frm.normalizationProtocol.value);
2803 14 Oct 14 nicklas 1029     submitInfo.bioplate = plateInfo;
2803 14 Oct 14 nicklas 1030     submitInfo.flagged = flaggedRnaInfo;
3302 04 May 15 nicklas 1031     var schema = PoolSchema.getById(frm.pool_schema.value);
2803 14 Oct 14 nicklas 1032     
2803 14 Oct 14 nicklas 1033     plateInfo.name = Plate.name;
2803 14 Oct 14 nicklas 1034     plateInfo.comments = frm.comments.value;
5881 25 Mar 20 nicklas 1035     plateInfo.plateType = Data.get('page-data', 'plate-type');
2803 14 Oct 14 nicklas 1036     plateInfo.poolSchema = schema ? schema.id : null;
5882 26 Mar 20 nicklas 1037
2803 14 Oct 14 nicklas 1038     plateInfo.wells = [];
2803 14 Oct 14 nicklas 1039     var wells = Plate.getWells();
2803 14 Oct 14 nicklas 1040     for (var i = 0; i < wells.length; i++)
2803 14 Oct 14 nicklas 1041     {
2803 14 Oct 14 nicklas 1042       var well = wells[i];
2803 14 Oct 14 nicklas 1043       var rna = well.extract;
2803 14 Oct 14 nicklas 1044       if (rna && rna.id)
2803 14 Oct 14 nicklas 1045       {
2803 14 Oct 14 nicklas 1046         var tmp = {};
2803 14 Oct 14 nicklas 1047         tmp.row = well.row;
2803 14 Oct 14 nicklas 1048         tmp.column = well.column;
2803 14 Oct 14 nicklas 1049         tmp.rna = {};
2803 14 Oct 14 nicklas 1050         tmp.rna.id = rna.id;
4377 02 Mar 17 nicklas 1051         tmp.rna.usedQuantity = rna.usedQuantity || (rna.qc ? QUANTITY_QC : QUANTITY_REGULAR);
3303 04 May 15 nicklas 1052         tmp.rna.dilutionConc = rna.dilutionConc;
3832 07 Apr 16 nicklas 1053         tmp.rna.dilutionVolume = TOTAL_VOLUME;
3303 04 May 15 nicklas 1054         tmp.rna.qc = rna.qc;
2803 14 Oct 14 nicklas 1055         tmp.rna.comment = rna.comment;
3302 04 May 15 nicklas 1056         if (well.barcode)
3302 04 May 15 nicklas 1057         {
3302 04 May 15 nicklas 1058           tmp.rna.barcode = well.barcode;
3302 04 May 15 nicklas 1059         }
2803 14 Oct 14 nicklas 1060         plateInfo.wells[plateInfo.wells.length] = tmp;
2803 14 Oct 14 nicklas 1061       }
2803 14 Oct 14 nicklas 1062     }
2803 14 Oct 14 nicklas 1063
2803 14 Oct 14 nicklas 1064     var flagged = Rna.getFlagged();
2803 14 Oct 14 nicklas 1065     for (var i = 0; i < flagged.length; i++)
2803 14 Oct 14 nicklas 1066     {
2803 14 Oct 14 nicklas 1067       var rna = flagged[i];
2803 14 Oct 14 nicklas 1068       var tmp = {};
2803 14 Oct 14 nicklas 1069       tmp.id = rna.id;
2803 14 Oct 14 nicklas 1070       tmp.flag = rna.flag;
2803 14 Oct 14 nicklas 1071       tmp.comment = rna.comment;
2803 14 Oct 14 nicklas 1072       flaggedRnaInfo[flaggedRnaInfo.length] = tmp;
2803 14 Oct 14 nicklas 1073     }
2803 14 Oct 14 nicklas 1074     var url = '../MRna.servlet?ID='+App.getSessionId();
3302 04 May 15 nicklas 1075     url += '&cmd=CreateMRnaOrLibPlate';
2803 14 Oct 14 nicklas 1076     Wizard.showLoadingAnimation('Performing registration...');
2803 14 Oct 14 nicklas 1077     Wizard.asyncJsonRequest(url, selectrna.submissionResults, 'POST', JSON.stringify(submitInfo));
2803 14 Oct 14 nicklas 1078   }
2803 14 Oct 14 nicklas 1079   
2803 14 Oct 14 nicklas 1080   selectrna.submissionResults = function(response)
2803 14 Oct 14 nicklas 1081   {
4650 08 Jan 18 nicklas 1082     window.removeEventListener('beforeunload', selectrna.confirmLeaveWizard);
2803 14 Oct 14 nicklas 1083     Wizard.showFinalMessage(response.messages);
2803 14 Oct 14 nicklas 1084     Doc.show('gorestart');
2803 14 Oct 14 nicklas 1085   }
2803 14 Oct 14 nicklas 1086   
2803 14 Oct 14 nicklas 1087   selectrna.initElements = function(element, autoInit)
2803 14 Oct 14 nicklas 1088   {
2803 14 Oct 14 nicklas 1089     if (autoInit == 'plate-col')
2803 14 Oct 14 nicklas 1090     {
2803 14 Oct 14 nicklas 1091       Events.addEventHandler(element, 'click', selectrna.toggleColumn);
2803 14 Oct 14 nicklas 1092       Events.addEventHandler(element, 'mouseover', selectrna.highlightColumn);
2803 14 Oct 14 nicklas 1093       Events.addEventHandler(element, 'mouseout', selectrna.highlightColumn);
2803 14 Oct 14 nicklas 1094     }
2803 14 Oct 14 nicklas 1095     else if (autoInit == 'plate-row')
2803 14 Oct 14 nicklas 1096     {
2803 14 Oct 14 nicklas 1097       Events.addEventHandler(element, 'click', selectrna.toggleRow);
2803 14 Oct 14 nicklas 1098       Events.addEventHandler(element, 'mouseover', selectrna.highlightRow);
2803 14 Oct 14 nicklas 1099       Events.addEventHandler(element, 'mouseout', selectrna.highlightRow);
2803 14 Oct 14 nicklas 1100     }
2803 14 Oct 14 nicklas 1101     else if (autoInit == 'plate-well')
2803 14 Oct 14 nicklas 1102     {
2803 14 Oct 14 nicklas 1103       Events.addEventHandler(element, 'click', selectrna.toggleWell);
2803 14 Oct 14 nicklas 1104       Events.addEventHandler(element, 'mouseover', selectrna.highlightReplicated);
2803 14 Oct 14 nicklas 1105       Events.addEventHandler(element, 'mouseout', selectrna.highlightReplicated);
2803 14 Oct 14 nicklas 1106     }
2803 14 Oct 14 nicklas 1107     else if (autoInit == 'special-select')
2803 14 Oct 14 nicklas 1108     {
2803 14 Oct 14 nicklas 1109       Events.addEventHandler(element, 'click', selectrna.specialToggle)
2803 14 Oct 14 nicklas 1110     }
2803 14 Oct 14 nicklas 1111   }
2803 14 Oct 14 nicklas 1112
2803 14 Oct 14 nicklas 1113   // Toggle the selected status of a single well
2803 14 Oct 14 nicklas 1114   selectrna.toggleWell = function(event)
2803 14 Oct 14 nicklas 1115   {
2803 14 Oct 14 nicklas 1116     var row = Data.int(event.currentTarget, 'row');
2803 14 Oct 14 nicklas 1117     var column = Data.int(event.currentTarget, 'col');
2803 14 Oct 14 nicklas 1118     var well = Plate.getWell(row, column);
2803 14 Oct 14 nicklas 1119     Plate.toggleSelected([well]);
2803 14 Oct 14 nicklas 1120   }
2803 14 Oct 14 nicklas 1121
2803 14 Oct 14 nicklas 1122   // Toggle the selected status of a complete row
2803 14 Oct 14 nicklas 1123   selectrna.toggleRow = function(event)
2803 14 Oct 14 nicklas 1124   {
2803 14 Oct 14 nicklas 1125     var row = Data.int(event.currentTarget, 'row');
2803 14 Oct 14 nicklas 1126     Plate.toggleSelected(Plate.getRow(row));
2803 14 Oct 14 nicklas 1127   }
2803 14 Oct 14 nicklas 1128
2803 14 Oct 14 nicklas 1129   // Toggle the selected status of a complete column
2803 14 Oct 14 nicklas 1130   selectrna.toggleColumn = function(event)
2803 14 Oct 14 nicklas 1131   {
2803 14 Oct 14 nicklas 1132     var column = Data.int(event.currentTarget, 'col');
2803 14 Oct 14 nicklas 1133     Plate.toggleSelected(Plate.getColumn(column));
2803 14 Oct 14 nicklas 1134   }
2803 14 Oct 14 nicklas 1135   
2803 14 Oct 14 nicklas 1136   // Toggle the selected status of a pool
2803 14 Oct 14 nicklas 1137   selectrna.togglePool = function(event)
2803 14 Oct 14 nicklas 1138   {
2803 14 Oct 14 nicklas 1139     var pool = Data.int(event.target, 'pool-num');
2803 14 Oct 14 nicklas 1140     if (!isNaN(pool)) Plate.toggleSelected(Plate.getPool(pool));
2803 14 Oct 14 nicklas 1141   }
2803 14 Oct 14 nicklas 1142   
2803 14 Oct 14 nicklas 1143   // Highlight enable/disable all wells in a column
2803 14 Oct 14 nicklas 1144   selectrna.highlightColumn = function(event)
2803 14 Oct 14 nicklas 1145   {
2803 14 Oct 14 nicklas 1146     var column = Data.int(event.currentTarget, 'col');
2803 14 Oct 14 nicklas 1147     var on = event.type == 'mouseover';
2803 14 Oct 14 nicklas 1148     
2803 14 Oct 14 nicklas 1149     Doc.addOrRemoveClass(event.currentTarget, 'highlight-column', on);
2803 14 Oct 14 nicklas 1150     var wells = Plate.getColumn(column);
2803 14 Oct 14 nicklas 1151     Plate.setHighlight(wells, 'highlight-column', on);
2803 14 Oct 14 nicklas 1152   }
2803 14 Oct 14 nicklas 1153
2803 14 Oct 14 nicklas 1154   // Highlight enable/disable all wells in a row
2803 14 Oct 14 nicklas 1155   selectrna.highlightRow = function(event)
2803 14 Oct 14 nicklas 1156   {
2803 14 Oct 14 nicklas 1157     var row = Data.int(event.currentTarget, 'row');
2803 14 Oct 14 nicklas 1158     var on = event.type == 'mouseover';
2803 14 Oct 14 nicklas 1159     
2803 14 Oct 14 nicklas 1160     Doc.addOrRemoveClass(event.currentTarget, 'highlight-row', on);
2803 14 Oct 14 nicklas 1161     var wells = Plate.getRow(row);
2803 14 Oct 14 nicklas 1162     Plate.setHighlight(wells, 'highlight-row', on);
2803 14 Oct 14 nicklas 1163   }
2803 14 Oct 14 nicklas 1164   
2803 14 Oct 14 nicklas 1165   // Highligt enable/disable all wells in a pool
2803 14 Oct 14 nicklas 1166   selectrna.highlightPool = function(event)
2803 14 Oct 14 nicklas 1167   {
2803 14 Oct 14 nicklas 1168     var pool = Data.int(event.target, 'pool-num');
2803 14 Oct 14 nicklas 1169     var on = event.type == 'mouseover';
2803 14 Oct 14 nicklas 1170     if (!isNaN(pool))
2803 14 Oct 14 nicklas 1171     {
2803 14 Oct 14 nicklas 1172       Doc.addOrRemoveClass(event.target, 'highlight-pool', on);
2803 14 Oct 14 nicklas 1173       var wells = Plate.getPool(pool);
2803 14 Oct 14 nicklas 1174       Plate.setHighlight(wells, 'highlight-pool', on);
2803 14 Oct 14 nicklas 1175     }
2803 14 Oct 14 nicklas 1176   }
2803 14 Oct 14 nicklas 1177
2803 14 Oct 14 nicklas 1178   /**
2803 14 Oct 14 nicklas 1179     Highlight all replicated wells with the same RNA as the given well.
2803 14 Oct 14 nicklas 1180   */
2803 14 Oct 14 nicklas 1181   selectrna.highlightReplicated = function(event)
2803 14 Oct 14 nicklas 1182   {
2803 14 Oct 14 nicklas 1183     var column = Data.int(event.currentTarget, 'col');
2803 14 Oct 14 nicklas 1184     var row = Data.int(event.currentTarget, 'row');
2803 14 Oct 14 nicklas 1185     var on = event.type == 'mouseover';
2803 14 Oct 14 nicklas 1186     
2803 14 Oct 14 nicklas 1187     var well = Plate.getWell(row, column);
2803 14 Oct 14 nicklas 1188     if (well.extract && well.replicate)
2803 14 Oct 14 nicklas 1189     {
2803 14 Oct 14 nicklas 1190       // Get center coordinates for the current well
2803 14 Oct 14 nicklas 1191       var pos = Doc.getElementPosition(well.tag);
2803 14 Oct 14 nicklas 1192       var jsPos = new jsPoint(pos.left+pos.width/2, pos.top+pos.height/2);
2803 14 Oct 14 nicklas 1193   
2803 14 Oct 14 nicklas 1194       var replicated = Plate.getWellsByName(well.extract.name);
2803 14 Oct 14 nicklas 1195       for (var i = 0; i < replicated.length; i++)
2803 14 Oct 14 nicklas 1196       {
2803 14 Oct 14 nicklas 1197         var rep = replicated[i];
2803 14 Oct 14 nicklas 1198         if (rep != well)
2803 14 Oct 14 nicklas 1199         {
2803 14 Oct 14 nicklas 1200           Doc.addOrRemoveClass(rep.tag, 'highlight-replicated', on);
2803 14 Oct 14 nicklas 1201           if (rep.line)
2803 14 Oct 14 nicklas 1202           {
2803 14 Oct 14 nicklas 1203             // Clear any recent lines
2803 14 Oct 14 nicklas 1204             graphics.clearDrawing(rep.line);
2803 14 Oct 14 nicklas 1205             rep.line = null;
2803 14 Oct 14 nicklas 1206           }
2803 14 Oct 14 nicklas 1207           if (on)
2803 14 Oct 14 nicklas 1208           {
2803 14 Oct 14 nicklas 1209             // We draw a line between the current and replicated well
2803 14 Oct 14 nicklas 1210             var rPos = Doc.getElementPosition(rep.tag);
2803 14 Oct 14 nicklas 1211             rep.line = graphics.drawLine(pen, jsPos, new jsPoint(rPos.left+rPos.width/2, rPos.top+rPos.height/2));
2803 14 Oct 14 nicklas 1212           }
2803 14 Oct 14 nicklas 1213         }
2803 14 Oct 14 nicklas 1214       }
2803 14 Oct 14 nicklas 1215     }
2803 14 Oct 14 nicklas 1216   }
2803 14 Oct 14 nicklas 1217
2803 14 Oct 14 nicklas 1218   // Some special toogle operations
2803 14 Oct 14 nicklas 1219   selectrna.specialToggle = function(event)
2803 14 Oct 14 nicklas 1220   {
2803 14 Oct 14 nicklas 1221     var what = Data.get(event.currentTarget, 'special');
2803 14 Oct 14 nicklas 1222     var wells = [];
2803 14 Oct 14 nicklas 1223     if (what == 'all' || what == 'empty' || what == 'none')
2803 14 Oct 14 nicklas 1224     {
2803 14 Oct 14 nicklas 1225       // All wells or all empty (will be filtered later)
2803 14 Oct 14 nicklas 1226       wells = Plate.getWells();
2803 14 Oct 14 nicklas 1227     }
2803 14 Oct 14 nicklas 1228     else if (what == 'pools' || what == 'empty-pools')
2803 14 Oct 14 nicklas 1229     {
2803 14 Oct 14 nicklas 1230       // All primary pools or all empty in the primary pools (will be filtered later)
2803 14 Oct 14 nicklas 1231       for (var i = 0; i < Plate.poolSchema.numPools; i++)
2803 14 Oct 14 nicklas 1232       {
2803 14 Oct 14 nicklas 1233         wells = wells.concat(Plate.getPool(i));
2803 14 Oct 14 nicklas 1234       }
2803 14 Oct 14 nicklas 1235     }
2803 14 Oct 14 nicklas 1236     else if (what == 'stratagene')
2803 14 Oct 14 nicklas 1237     {
2803 14 Oct 14 nicklas 1238       // All wells with 'Stratagene'
2803 14 Oct 14 nicklas 1239       var tmp = Plate.getWells();
2803 14 Oct 14 nicklas 1240       for (var i = 0; i < tmp.length; i++)
2803 14 Oct 14 nicklas 1241       {
2803 14 Oct 14 nicklas 1242         var well = tmp[i];
2803 14 Oct 14 nicklas 1243         if (well.extract && well.extract.stratagene) wells[wells.length] = well;
2803 14 Oct 14 nicklas 1244       }
2803 14 Oct 14 nicklas 1245     }
2803 14 Oct 14 nicklas 1246     else if (what == 'external')
2803 14 Oct 14 nicklas 1247     {
2803 14 Oct 14 nicklas 1248       // All wells with 'External RNA'
2803 14 Oct 14 nicklas 1249       var tmp = Plate.getWells();
2803 14 Oct 14 nicklas 1250       for (var i = 0; i < tmp.length; i++)
2803 14 Oct 14 nicklas 1251       {
2803 14 Oct 14 nicklas 1252         var well = tmp[i];
2803 14 Oct 14 nicklas 1253         if (well.extract && well.extract.external) wells[wells.length] = well;
2803 14 Oct 14 nicklas 1254       }
2803 14 Oct 14 nicklas 1255     }
2803 14 Oct 14 nicklas 1256     else if (what == 'replicates')
2803 14 Oct 14 nicklas 1257     {
2803 14 Oct 14 nicklas 1258       // All wells with replicated RNA
2803 14 Oct 14 nicklas 1259       var tmp = Plate.getWells();
2803 14 Oct 14 nicklas 1260       for (var i = 0; i < tmp.length; i++)
2803 14 Oct 14 nicklas 1261       {
2803 14 Oct 14 nicklas 1262         var well = tmp[i];
2803 14 Oct 14 nicklas 1263         if (well.extract && well.replicate) wells[wells.length] = well;
2803 14 Oct 14 nicklas 1264       }
2803 14 Oct 14 nicklas 1265     }
2803 14 Oct 14 nicklas 1266     else if (what == 'error')
2803 14 Oct 14 nicklas 1267     {
2803 14 Oct 14 nicklas 1268       // All wells with an error
2803 14 Oct 14 nicklas 1269       var tmp = Plate.getWells();
2803 14 Oct 14 nicklas 1270       for (var i = 0; i < tmp.length; i++)
2803 14 Oct 14 nicklas 1271       {
2803 14 Oct 14 nicklas 1272         var well = tmp[i];
2803 14 Oct 14 nicklas 1273         if (well.hasError()) wells[wells.length] = well;
2803 14 Oct 14 nicklas 1274       }
2803 14 Oct 14 nicklas 1275     }
2803 14 Oct 14 nicklas 1276     else if (what == 'warning')
2803 14 Oct 14 nicklas 1277     {
2803 14 Oct 14 nicklas 1278       // All wells with a warning
2803 14 Oct 14 nicklas 1279       var tmp = Plate.getWells();
2803 14 Oct 14 nicklas 1280       for (var i = 0; i < tmp.length; i++)
2803 14 Oct 14 nicklas 1281       {
2803 14 Oct 14 nicklas 1282         var well = tmp[i];
2803 14 Oct 14 nicklas 1283         if (well.warning) wells[wells.length] = well;
2803 14 Oct 14 nicklas 1284       }
2803 14 Oct 14 nicklas 1285     }
2803 14 Oct 14 nicklas 1286     
2803 14 Oct 14 nicklas 1287     // Extra filter for empty wells only
2803 14 Oct 14 nicklas 1288     if (what.indexOf('empty') != -1)
2803 14 Oct 14 nicklas 1289     {
2803 14 Oct 14 nicklas 1290       var tmp = wells;
2803 14 Oct 14 nicklas 1291       wells = [];
2803 14 Oct 14 nicklas 1292       for (var i = 0; i < tmp.length; i++)
2803 14 Oct 14 nicklas 1293       {
2803 14 Oct 14 nicklas 1294         if (!tmp[i].extract) wells[wells.length] = tmp[i];
2803 14 Oct 14 nicklas 1295       }
2803 14 Oct 14 nicklas 1296     }
2803 14 Oct 14 nicklas 1297     
2803 14 Oct 14 nicklas 1298     if (what == 'none')
2803 14 Oct 14 nicklas 1299     {
2803 14 Oct 14 nicklas 1300       Plate.setSelected(wells, false);
2803 14 Oct 14 nicklas 1301     }
2803 14 Oct 14 nicklas 1302     else
2803 14 Oct 14 nicklas 1303     {
2803 14 Oct 14 nicklas 1304       Plate.toggleSelected(wells);
2803 14 Oct 14 nicklas 1305     }
2803 14 Oct 14 nicklas 1306   }
2803 14 Oct 14 nicklas 1307
2803 14 Oct 14 nicklas 1308
2803 14 Oct 14 nicklas 1309   return selectrna;
2803 14 Oct 14 nicklas 1310 }();
2803 14 Oct 14 nicklas 1311
2803 14 Oct 14 nicklas 1312 Doc.onLoad(SelectRna.initPage);
2803 14 Oct 14 nicklas 1313 Doc.addElementInitializer(SelectRna.initElements);
2803 14 Oct 14 nicklas 1314
2803 14 Oct 14 nicklas 1315
2803 14 Oct 14 nicklas 1316 var Rna = function()
2803 14 Oct 14 nicklas 1317 {
2803 14 Oct 14 nicklas 1318   var rna = {};
2803 14 Oct 14 nicklas 1319   var flagged = [];
2803 14 Oct 14 nicklas 1320   var info = [];
2803 14 Oct 14 nicklas 1321   
2803 14 Oct 14 nicklas 1322   /**
2803 14 Oct 14 nicklas 1323     Create a new RNA object by name. More information
2803 14 Oct 14 nicklas 1324     about the RNA is automatically loaded from the database.
2803 14 Oct 14 nicklas 1325   */
2803 14 Oct 14 nicklas 1326   rna.createByName = function(name)
2803 14 Oct 14 nicklas 1327   {
2803 14 Oct 14 nicklas 1328     var tmp = {};
2803 14 Oct 14 nicklas 1329     tmp.name = name;
2803 14 Oct 14 nicklas 1330     tmp.stratagene = Reggie.isStratagene(name)
2803 14 Oct 14 nicklas 1331     tmp.external = Reggie.isExternal(name);
2803 14 Oct 14 nicklas 1332     tmp.info = rna.infoByName(name);
2803 14 Oct 14 nicklas 1333     tmp.id = tmp.info.id;
2803 14 Oct 14 nicklas 1334     return tmp;
2803 14 Oct 14 nicklas 1335   }
2803 14 Oct 14 nicklas 1336   
2803 14 Oct 14 nicklas 1337   /**
2803 14 Oct 14 nicklas 1338     Create a new RNA object by info object.
2803 14 Oct 14 nicklas 1339   */
2803 14 Oct 14 nicklas 1340   rna.createByInfo = function(info)
2803 14 Oct 14 nicklas 1341   {
2803 14 Oct 14 nicklas 1342     var tmp = {};
2803 14 Oct 14 nicklas 1343     tmp.name = info.name;
2803 14 Oct 14 nicklas 1344     tmp.stratagene = Reggie.isStratagene(tmp.name);
2803 14 Oct 14 nicklas 1345     tmp.external = Reggie.isExternal(tmp.name);
2803 14 Oct 14 nicklas 1346     tmp.id = info.id;
2803 14 Oct 14 nicklas 1347     tmp.info = info;
2803 14 Oct 14 nicklas 1348     return tmp;
2803 14 Oct 14 nicklas 1349   }
2803 14 Oct 14 nicklas 1350   
2803 14 Oct 14 nicklas 1351   /**
2803 14 Oct 14 nicklas 1352     Get information about a RNA item with a given name.
2803 14 Oct 14 nicklas 1353   */
2803 14 Oct 14 nicklas 1354   rna.infoByName = function(name)
2803 14 Oct 14 nicklas 1355   {
2803 14 Oct 14 nicklas 1356     var key = 'N'+name;
2803 14 Oct 14 nicklas 1357     if (!info[key])
2803 14 Oct 14 nicklas 1358     {
2803 14 Oct 14 nicklas 1359       rna.loadInfoByNames([name]);
2803 14 Oct 14 nicklas 1360       if (!info[key]) info[key] = {};
2803 14 Oct 14 nicklas 1361     }
2803 14 Oct 14 nicklas 1362     return info[key];
2803 14 Oct 14 nicklas 1363   }
2803 14 Oct 14 nicklas 1364
2803 14 Oct 14 nicklas 1365   /**
2803 14 Oct 14 nicklas 1366     Load and cache RNA information for all RNA items with a name in the
2803 14 Oct 14 nicklas 1367     given list.
2803 14 Oct 14 nicklas 1368   */
2803 14 Oct 14 nicklas 1369   rna.loadInfoByNames = function(names)
2803 14 Oct 14 nicklas 1370   {
2808 15 Oct 14 nicklas 1371     var newNames = [];
2808 15 Oct 14 nicklas 1372     for (var i = 0; i < names.length; i++)
2808 15 Oct 14 nicklas 1373     {
2808 15 Oct 14 nicklas 1374       if (!info['N'+names[i]]) newNames[newNames.length] = names[i];
2808 15 Oct 14 nicklas 1375     }
2808 15 Oct 14 nicklas 1376     
2803 14 Oct 14 nicklas 1377     var submitInfo = {};
2808 15 Oct 14 nicklas 1378     submitInfo.names = newNames;
2808 15 Oct 14 nicklas 1379     
2808 15 Oct 14 nicklas 1380     if (newNames.length > 0)
2808 15 Oct 14 nicklas 1381     {
2808 15 Oct 14 nicklas 1382       var url = '../MRna.servlet?ID='+App.getSessionId();
2808 15 Oct 14 nicklas 1383       url += '&cmd=GetRnaInfoFromNames';  
2808 15 Oct 14 nicklas 1384       var response = Wizard.syncJsonRequest(url, 'POST', JSON.stringify(submitInfo));
2808 15 Oct 14 nicklas 1385       rna.cacheInfo(response.rna);
2808 15 Oct 14 nicklas 1386     }
2803 14 Oct 14 nicklas 1387   }
2803 14 Oct 14 nicklas 1388   
2803 14 Oct 14 nicklas 1389   rna.cacheInfo = function(rnaList)
2803 14 Oct 14 nicklas 1390   {
3645 03 Dec 15 nicklas 1391     if (!rnaList) return;
2803 14 Oct 14 nicklas 1392     for (var i = 0; i < rnaList.length; i++)
2803 14 Oct 14 nicklas 1393     {
2803 14 Oct 14 nicklas 1394       var r = rnaList[i];
2803 14 Oct 14 nicklas 1395       info['N'+r.name] = r;
2803 14 Oct 14 nicklas 1396       info['I'+r.id] = r;
2803 14 Oct 14 nicklas 1397       if (r.flag) flagged[flagged.length] = r;
2803 14 Oct 14 nicklas 1398     }
2803 14 Oct 14 nicklas 1399   }
2803 14 Oct 14 nicklas 1400
2803 14 Oct 14 nicklas 1401   rna.unflag = function(r)
2803 14 Oct 14 nicklas 1402   {
2803 14 Oct 14 nicklas 1403     if (!r.info || !r.info.flag) return false;
2803 14 Oct 14 nicklas 1404
2803 14 Oct 14 nicklas 1405     r.info.flag = null;
2803 14 Oct 14 nicklas 1406     for (var i = 0; i < flagged.length; i++)
2803 14 Oct 14 nicklas 1407     {
2803 14 Oct 14 nicklas 1408       if (r.id == flagged[i].id)
2803 14 Oct 14 nicklas 1409       {
2803 14 Oct 14 nicklas 1410         flagged.splice(i, 1);
2803 14 Oct 14 nicklas 1411         break;
2803 14 Oct 14 nicklas 1412       }
2803 14 Oct 14 nicklas 1413     }
2803 14 Oct 14 nicklas 1414     return true;
2803 14 Oct 14 nicklas 1415   }
2803 14 Oct 14 nicklas 1416   
2803 14 Oct 14 nicklas 1417   rna.flag = function(r, flag)
2803 14 Oct 14 nicklas 1418   {
2803 14 Oct 14 nicklas 1419     if (!r.info || r.info.flag) return false;
2803 14 Oct 14 nicklas 1420     r.info.flag = flag;
2803 14 Oct 14 nicklas 1421     flagged[flagged.length] = r.info;
2803 14 Oct 14 nicklas 1422   }
2803 14 Oct 14 nicklas 1423   
2803 14 Oct 14 nicklas 1424   rna.getFlagged = function()
2803 14 Oct 14 nicklas 1425   {
2803 14 Oct 14 nicklas 1426     return flagged;
2803 14 Oct 14 nicklas 1427   }
2803 14 Oct 14 nicklas 1428   
2803 14 Oct 14 nicklas 1429   return rna;
2803 14 Oct 14 nicklas 1430 }();
2803 14 Oct 14 nicklas 1431
2803 14 Oct 14 nicklas 1432
2803 14 Oct 14 nicklas 1433
2803 14 Oct 14 nicklas 1434 var WellPainter = function()
2803 14 Oct 14 nicklas 1435 {
2803 14 Oct 14 nicklas 1436   var painter = {};
2803 14 Oct 14 nicklas 1437   
2803 14 Oct 14 nicklas 1438   // Add class indicators for replicates and QC assigned wells
2803 14 Oct 14 nicklas 1439   painter.getClassNameForWell = function(well)
2803 14 Oct 14 nicklas 1440   {
2803 14 Oct 14 nicklas 1441     var cls = '';
2803 14 Oct 14 nicklas 1442     if (well.extract)
2803 14 Oct 14 nicklas 1443     {
3757 18 Feb 16 nicklas 1444       var rna = well.extract;
2803 14 Oct 14 nicklas 1445       if (well.replicate) cls += ' replicate';
3757 18 Feb 16 nicklas 1446       if (rna.qc) cls += ' qc';
3757 18 Feb 16 nicklas 1447       if (rna.info.specimen && rna.info.specimen.YellowLabel != null)
3757 18 Feb 16 nicklas 1448       {
3757 18 Feb 16 nicklas 1449         cls += ' yellow-specimen';
3757 18 Feb 16 nicklas 1450       }
2803 14 Oct 14 nicklas 1451     }
3297 30 Apr 15 nicklas 1452     if (well.column == Plate.columns-1) cls += ' last-child';
2803 14 Oct 14 nicklas 1453     return cls;
2803 14 Oct 14 nicklas 1454   }
2803 14 Oct 14 nicklas 1455   
2803 14 Oct 14 nicklas 1456   painter.getWellText = function(well)
2803 14 Oct 14 nicklas 1457   {
2803 14 Oct 14 nicklas 1458     var text = '';
2803 14 Oct 14 nicklas 1459     if (well.duplicates)
2803 14 Oct 14 nicklas 1460     {
2803 14 Oct 14 nicklas 1461       well.setError('Duplicate RNA in this location');
2803 14 Oct 14 nicklas 1462       text += '<div class="name">'+Strings.encodeTags(well.duplicates.join(', '))+'</div>';
2803 14 Oct 14 nicklas 1463     }
2803 14 Oct 14 nicklas 1464     else if (well.extract)
2803 14 Oct 14 nicklas 1465     {
2803 14 Oct 14 nicklas 1466       // The well contains RNA
2803 14 Oct 14 nicklas 1467       var rna = well.extract;
2803 14 Oct 14 nicklas 1468       var info = rna.info;
3757 18 Feb 16 nicklas 1469       text += '<div class="name if-yellow">'+Strings.encodeTags(rna.name)+'</div>';
2803 14 Oct 14 nicklas 1470       
2803 14 Oct 14 nicklas 1471       var warningMsg = [];
2803 14 Oct 14 nicklas 1472       if (info.bioWell)
2803 14 Oct 14 nicklas 1473       {
2803 14 Oct 14 nicklas 1474         var rnaWell = info.bioWell;
2803 14 Oct 14 nicklas 1475         text += '<div class="location">'+Strings.encodeTags(rnaWell.bioPlate.name+'['+rnaWell.location)+']</div>';
2803 14 Oct 14 nicklas 1476       }
2906 07 Nov 14 nicklas 1477       else if (info.preNormalized)
2906 07 Nov 14 nicklas 1478       {
2906 07 Nov 14 nicklas 1479         text += '<div class="location">PreNormalized</div>';
2906 07 Nov 14 nicklas 1480       }
2803 14 Oct 14 nicklas 1481       else if (!rna.stratagene && !rna.external)
2803 14 Oct 14 nicklas 1482       {
2803 14 Oct 14 nicklas 1483         warningMsg[warningMsg.length] = 'No location';
2803 14 Oct 14 nicklas 1484       }
2803 14 Oct 14 nicklas 1485
5740 20 Nov 19 nicklas 1486       if (info && info.id && !rna.stratagene)
2803 14 Oct 14 nicklas 1487       {
4650 08 Jan 18 nicklas 1488         rna.usedQuantity = Math.max(Math.min(info.remainingQuantity, rna.qc ? QUANTITY_QC : QUANTITY_REGULAR), QUANTITY_MINIMAL); // µg
3303 04 May 15 nicklas 1489         rna.dilutionConc = 1000 * rna.usedQuantity / TOTAL_VOLUME; // ng/µl
3303 04 May 15 nicklas 1490
6218 20 Apr 21 nicklas 1491         var volRNA = Math.ceil(10000*rna.usedQuantity/info.conc) / 10; // µl, rounded to 1 decimal
3302 04 May 15 nicklas 1492         var water = TOTAL_VOLUME - volRNA;
3301 04 May 15 nicklas 1493         
3302 04 May 15 nicklas 1494         if (volRNA < MINIMAL_RNA_VOLUME)
3301 04 May 15 nicklas 1495         {
3301 04 May 15 nicklas 1496           // Large mix since we do not want to take less than 1µl
3302 04 May 15 nicklas 1497           volRNA = MINIMAL_RNA_VOLUME;
6218 20 Apr 21 nicklas 1498           rna.usedQuantity = volRNA * info.conc / 1000; // µg
3303 04 May 15 nicklas 1499           var totalVolume = 1000 * rna.usedQuantity / rna.dilutionConc; // µl
3302 04 May 15 nicklas 1500           water = totalVolume - volRNA;
3301 04 May 15 nicklas 1501           warningMsg[warningMsg.length] = 'Large mix';
3301 04 May 15 nicklas 1502         }
3832 07 Apr 16 nicklas 1503         else if (volRNA > TOTAL_VOLUME)
3832 07 Apr 16 nicklas 1504         {
4650 08 Jan 18 nicklas 1505           volRNA = TOTAL_VOLUME;
6218 20 Apr 21 nicklas 1506           rna.usedQuantity = volRNA * info.conc / 1000; // µg
6218 20 Apr 21 nicklas 1507           rna.dilutionConc = info.conc;
4650 08 Jan 18 nicklas 1508           water = 0;
3832 07 Apr 16 nicklas 1509         }
3301 04 May 15 nicklas 1510         
2803 14 Oct 14 nicklas 1511         if (info.remainingQuantity)
2803 14 Oct 14 nicklas 1512         {
3832 07 Apr 16 nicklas 1513           var useNanoGram = info.remainingQuantity < 0.5;
3832 07 Apr 16 nicklas 1514           text += '<div class="quantity">'+(useNanoGram ? Reggie.formatNumber(info.remainingQuantity * 1000, 'ng', 1):Reggie.formatNumber(info.remainingQuantity, 'µg', 2)) + '</div>';
3832 07 Apr 16 nicklas 1515           
3832 07 Apr 16 nicklas 1516           if (info.remainingQuantity < rna.usedQuantity || rna.usedQuantity < QUANTITY_MINIMAL)
2803 14 Oct 14 nicklas 1517           {
3272 23 Apr 15 nicklas 1518             well.setError('Not enough RNA');
2803 14 Oct 14 nicklas 1519           }
2803 14 Oct 14 nicklas 1520           // Warning if near the limit
2906 07 Nov 14 nicklas 1521           if (info.remainingQuantity < LOW_QUANTITY_WARNING_LIMIT && !info.preNormalized)
2803 14 Oct 14 nicklas 1522           {
2803 14 Oct 14 nicklas 1523             warningMsg[warningMsg.length] = 'Low quantity';
2803 14 Oct 14 nicklas 1524           }
2803 14 Oct 14 nicklas 1525         }
2803 14 Oct 14 nicklas 1526         else
2803 14 Oct 14 nicklas 1527         {
5740 20 Nov 19 nicklas 1528           if (!rna.external) warningMsg[warningMsg.length] = 'No quantity';
2803 14 Oct 14 nicklas 1529         }
2803 14 Oct 14 nicklas 1530         if (info.rqs)
2803 14 Oct 14 nicklas 1531         {
2803 14 Oct 14 nicklas 1532           text += '<div class="quality-score">RQS='+Numbers.formatNumber(info.rqs, 1) + '</div>';
2803 14 Oct 14 nicklas 1533           if (info.rqs < QUALITY_SCORE_WARNING_LIMIT) warningMsg[warningMsg.length] = 'Low RQS value';
2803 14 Oct 14 nicklas 1534         }
2803 14 Oct 14 nicklas 1535         else if (info.rin)
2803 14 Oct 14 nicklas 1536         {
2803 14 Oct 14 nicklas 1537           text += '<div class="quality-score">RIN='+Numbers.formatNumber(info.rin, 1) + '</div>';
2803 14 Oct 14 nicklas 1538           if (info.rin < QUALITY_SCORE_WARNING_LIMIT) warningMsg[warningMsg.length] = 'Low RIN value';
2803 14 Oct 14 nicklas 1539         }
5740 20 Nov 19 nicklas 1540         else if (!info.preNormalized && !rna.external)
2803 14 Oct 14 nicklas 1541         {
2803 14 Oct 14 nicklas 1542           warningMsg[warningMsg.length] = 'No RQS/RIN value';
2803 14 Oct 14 nicklas 1543         }
6218 20 Apr 21 nicklas 1544         if (info.conc)
2803 14 Oct 14 nicklas 1545         {
6218 20 Apr 21 nicklas 1546           text += '<div class="conc">'+Numbers.formatNumber(info.conc, 2) + 'ng/µl</div>';
3302 04 May 15 nicklas 1547           text += '<div class="volumes"><span class="volume">'+Numbers.formatNumber(volRNA, 1)+'</span> + <span class="water">'+Numbers.formatNumber(water, 1)+'µl</span></div>';
2803 14 Oct 14 nicklas 1548         }
5740 20 Nov 19 nicklas 1549         else 
2803 14 Oct 14 nicklas 1550         {
6218 20 Apr 21 nicklas 1551           if (!rna.external) warningMsg[warningMsg.length] = 'No concentration';
2803 14 Oct 14 nicklas 1552         }
2906 07 Nov 14 nicklas 1553         if (info.QiacubeDate)
2803 14 Oct 14 nicklas 1554         {
2906 07 Nov 14 nicklas 1555           text += '<div class="qiacube-date">'+info.QiacubeDate+'</div>';
2803 14 Oct 14 nicklas 1556         }
2906 07 Nov 14 nicklas 1557         else if (info.DilutionDate)
2906 07 Nov 14 nicklas 1558         {
2906 07 Nov 14 nicklas 1559           text += '<div class="dilution-date">'+info.DilutionDate+'</div>';
2906 07 Nov 14 nicklas 1560         }
2803 14 Oct 14 nicklas 1561         else
2803 14 Oct 14 nicklas 1562         {
5740 20 Nov 19 nicklas 1563           if (!rna.external) warningMsg[warningMsg.length] = info.preNormalized ? 'No DilutionDate value' : 'No QiacubeDate value';
2803 14 Oct 14 nicklas 1564         }
3112 04 Feb 15 nicklas 1565         if (info.AutoProcessing)
3112 04 Feb 15 nicklas 1566         {
3112 04 Feb 15 nicklas 1567           warningMsg[warningMsg.length] = info.AutoProcessing;
3112 04 Feb 15 nicklas 1568         }
4983 27 Sep 18 nicklas 1569         if (info.DO_NOT_USE)
4983 27 Sep 18 nicklas 1570         {
4983 27 Sep 18 nicklas 1571           warningMsg[warningMsg.length] = 'DoNotUse-'+Strings.encodeTags(info.DO_NOT_USE);
4983 27 Sep 18 nicklas 1572         }
3757 18 Feb 16 nicklas 1573         
2803 14 Oct 14 nicklas 1574       }
2803 14 Oct 14 nicklas 1575       else if (!rna.id)
2803 14 Oct 14 nicklas 1576       {
2803 14 Oct 14 nicklas 1577         well.setError('RNA not found');
2803 14 Oct 14 nicklas 1578       }
2803 14 Oct 14 nicklas 1579       if (rna.comment)
2803 14 Oct 14 nicklas 1580       {
2803 14 Oct 14 nicklas 1581         text += '<div class="comment">'+Strings.encodeTags(rna.comment)+'</div>';
2803 14 Oct 14 nicklas 1582       }
2803 14 Oct 14 nicklas 1583       if (info && info.comment)
2803 14 Oct 14 nicklas 1584       {
2803 14 Oct 14 nicklas 1585         text += '<div class="comment">'+Strings.encodeTags(info.comment)+'</div>';
2803 14 Oct 14 nicklas 1586       }
2803 14 Oct 14 nicklas 1587       if (warningMsg.length > 0)
2803 14 Oct 14 nicklas 1588       {
2803 14 Oct 14 nicklas 1589         well.setWarning(warningMsg.join('; '));
2803 14 Oct 14 nicklas 1590       }
2803 14 Oct 14 nicklas 1591     }
2803 14 Oct 14 nicklas 1592     else if (well.copyText)
2803 14 Oct 14 nicklas 1593     {
2803 14 Oct 14 nicklas 1594       text = '<div class="copy-text">'+well.copyText+'</div>';
2803 14 Oct 14 nicklas 1595     }
2803 14 Oct 14 nicklas 1596     else
2803 14 Oct 14 nicklas 1597     {
2803 14 Oct 14 nicklas 1598       text = 'empty';
2803 14 Oct 14 nicklas 1599     }
3300 04 May 15 nicklas 1600     if (well.duplicate)
3300 04 May 15 nicklas 1601     {
3300 04 May 15 nicklas 1602       well.setError('Duplicate barcode');
3300 04 May 15 nicklas 1603     }
3297 30 Apr 15 nicklas 1604
3297 30 Apr 15 nicklas 1605     var bc = Doc.element('barcode.'+well.row+'.'+well.column);
3297 30 Apr 15 nicklas 1606     if (bc)
3297 30 Apr 15 nicklas 1607     {
3297 30 Apr 15 nicklas 1608       var cls = 'barcode-well'
3297 30 Apr 15 nicklas 1609       cls += well.column == 0 ? ' barcode-left' : ' barcode-right';
3297 30 Apr 15 nicklas 1610
3297 30 Apr 15 nicklas 1611       if (well.barcode)
3297 30 Apr 15 nicklas 1612       {
3297 30 Apr 15 nicklas 1613         bc.innerHTML = well.barcode.name;
3297 30 Apr 15 nicklas 1614         var indexSet = painter.barcodeVariant ? painter.barcodeVariant.indexSets[well.column] : null;
3297 30 Apr 15 nicklas 1615         if (indexSet)
3297 30 Apr 15 nicklas 1616         {
3297 30 Apr 15 nicklas 1617           cls += ' ' + indexSet.color;
3297 30 Apr 15 nicklas 1618         }
3297 30 Apr 15 nicklas 1619         if (well.defaultBarcode && well.barcode != well.defaultBarcode)
3297 30 Apr 15 nicklas 1620         {
3297 30 Apr 15 nicklas 1621           cls += ' bg-modified';
3297 30 Apr 15 nicklas 1622         }
3297 30 Apr 15 nicklas 1623         if (well.duplicate)
3297 30 Apr 15 nicklas 1624         {
3297 30 Apr 15 nicklas 1625           cls += ' duplicate';
3297 30 Apr 15 nicklas 1626         }
3297 30 Apr 15 nicklas 1627       }
3297 30 Apr 15 nicklas 1628       bc.className = cls;
3297 30 Apr 15 nicklas 1629     }
2803 14 Oct 14 nicklas 1630     return text;
2803 14 Oct 14 nicklas 1631   }
2803 14 Oct 14 nicklas 1632   
2803 14 Oct 14 nicklas 1633   return painter;
2803 14 Oct 14 nicklas 1634 }();