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

Code
Comments
Other
Rev Date Author Line
2652 11 Sep 14 nicklas 1 var FlowCell = function()
2652 11 Sep 14 nicklas 2 {
2652 11 Sep 14 nicklas 3   var flowcell = {};
2656 11 Sep 14 nicklas 4   var debug = 0;
2652 11 Sep 14 nicklas 5   var subtypePooledLibrary = null;
5435 17 May 19 nicklas 6   var annotationTypePipeline = null;
5435 17 May 19 nicklas 7   
2652 11 Sep 14 nicklas 8   var flowCells = [];
2652 11 Sep 14 nicklas 9   var selectedPools = [];
3108 27 Jan 15 nicklas 10   var newPools;
2652 11 Sep 14 nicklas 11
2652 11 Sep 14 nicklas 12   var PRESET_NEXTSEQ = 'NextSeq';
2652 11 Sep 14 nicklas 13   var DEFAULT_READ_NEXTSEQ = [76, 6, 76];
2652 11 Sep 14 nicklas 14
2652 11 Sep 14 nicklas 15   var poolsAreValid = false;
2652 11 Sep 14 nicklas 16   var readIsValid = [];
2652 11 Sep 14 nicklas 17   var currentFcNo;
2652 11 Sep 14 nicklas 18   var currentLaneNo;
2652 11 Sep 14 nicklas 19
2652 11 Sep 14 nicklas 20   // Page initialization
2652 11 Sep 14 nicklas 21   flowcell.initPage = function()
2652 11 Sep 14 nicklas 22   {
2652 11 Sep 14 nicklas 23     // Step 1
2652 11 Sep 14 nicklas 24     Events.addEventHandler('step-1', 'wizard-validate', flowcell.validateStep1);
2652 11 Sep 14 nicklas 25     Events.addEventHandler('preset', 'change', flowcell.presetOnChange);
2652 11 Sep 14 nicklas 26     Events.addEventHandler('pools', 'change', flowcell.poolsOnChange);
2652 11 Sep 14 nicklas 27     Events.addEventHandler('pools', 'base-selected', flowcell.setPoolCallback);
2652 11 Sep 14 nicklas 28     Buttons.addClickHandler('btnSelectPools', flowcell.selectPools);
2652 11 Sep 14 nicklas 29     
2652 11 Sep 14 nicklas 30     // Step 2
2652 11 Sep 14 nicklas 31     Events.addEventHandler('step-2', 'wizard-initialize', flowcell.initializeStep2);
2652 11 Sep 14 nicklas 32     Events.addEventHandler('step-2', 'wizard-validate', flowcell.validateStep2);
2652 11 Sep 14 nicklas 33     Events.addEventHandler('read1', 'change', flowcell.readOnChange);
2652 11 Sep 14 nicklas 34     Events.addEventHandler('indexRead', 'change', flowcell.readOnChange);
2652 11 Sep 14 nicklas 35     Events.addEventHandler('read2', 'change', flowcell.readOnChange);
2842 20 Oct 14 nicklas 36     Events.addEventHandler('read1', 'keypress', Events.integerOnly);
2842 20 Oct 14 nicklas 37     Events.addEventHandler('indexRead', 'keypress', Events.integerOnly);
2842 20 Oct 14 nicklas 38     Events.addEventHandler('read2', 'keypress', Events.integerOnly);
2652 11 Sep 14 nicklas 39     Events.addEventHandler('select-pool', 'click', flowcell.onPoolSelected);
2796 13 Oct 14 nicklas 40     Events.addEventHandler('wizard', 'click', flowcell.hidePoolSelection);
2652 11 Sep 14 nicklas 41
2652 11 Sep 14 nicklas 42     // Navigation
2652 11 Sep 14 nicklas 43     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
2652 11 Sep 14 nicklas 44     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2652 11 Sep 14 nicklas 45     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2652 11 Sep 14 nicklas 46     Buttons.addClickHandler('goregister', Wizard.goRegister);
2652 11 Sep 14 nicklas 47     
2652 11 Sep 14 nicklas 48     // Final registration
2652 11 Sep 14 nicklas 49     Events.addEventHandler('wizard', 'wizard-submit', flowcell.submit);
2652 11 Sep 14 nicklas 50
2652 11 Sep 14 nicklas 51     var url = '../FlowCell.servlet?ID='+App.getSessionId();
2652 11 Sep 14 nicklas 52     url += '&cmd=GetUnusedPools';    
2652 11 Sep 14 nicklas 53     Wizard.showLoadingAnimation('Loading pools...');
2652 11 Sep 14 nicklas 54     Wizard.asyncJsonRequest(url, flowcell.initializeStep1);
2652 11 Sep 14 nicklas 55   }
2652 11 Sep 14 nicklas 56
2652 11 Sep 14 nicklas 57
2652 11 Sep 14 nicklas 58   flowcell.initializeStep1 = function(response)
2652 11 Sep 14 nicklas 59   {
3108 27 Jan 15 nicklas 60     flowcell.poolInfoLoaded(response);
3108 27 Jan 15 nicklas 61     flowcell.presetOnChange();
3108 27 Jan 15 nicklas 62     Doc.show('step-1');
3108 27 Jan 15 nicklas 63     Doc.show('gonext');
3108 27 Jan 15 nicklas 64   }
3108 27 Jan 15 nicklas 65   
3108 27 Jan 15 nicklas 66   flowcell.poolInfoLoaded = function(response)
3108 27 Jan 15 nicklas 67   {
2652 11 Sep 14 nicklas 68     var frm = document.forms['reggie'];
2652 11 Sep 14 nicklas 69     var pools = response.pools;
2652 11 Sep 14 nicklas 70     
2652 11 Sep 14 nicklas 71     var poolsList = frm.pools;
2652 11 Sep 14 nicklas 72     if (pools.length > 0)
2652 11 Sep 14 nicklas 73     {
2652 11 Sep 14 nicklas 74       for (var poolNo=0; poolNo < pools.length; poolNo++)
2652 11 Sep 14 nicklas 75       {
2652 11 Sep 14 nicklas 76         var pool = pools[poolNo];
3108 27 Jan 15 nicklas 77         var name = pool.name + ' (' + Numbers.formatNumber(pool.molarity, 2, 'nM')  + ') - ';
2652 11 Sep 14 nicklas 78         
2652 11 Sep 14 nicklas 79         var numPlates = pool.libPlates.length;
2652 11 Sep 14 nicklas 80         var title = '';
2652 11 Sep 14 nicklas 81
2652 11 Sep 14 nicklas 82         if (numPlates <= 2)
2652 11 Sep 14 nicklas 83         {
2652 11 Sep 14 nicklas 84           for (var plateNo=0; plateNo < numPlates; plateNo++)
2652 11 Sep 14 nicklas 85           {
2652 11 Sep 14 nicklas 86             var libPlate = pool.libPlates[plateNo];
2652 11 Sep 14 nicklas 87             if (plateNo > 0) name += ', ';
2652 11 Sep 14 nicklas 88             name += libPlate.name;
2652 11 Sep 14 nicklas 89           }
2652 11 Sep 14 nicklas 90         }
2652 11 Sep 14 nicklas 91         else
2652 11 Sep 14 nicklas 92         {
2652 11 Sep 14 nicklas 93           name += pool.libPlates[0].name + ' + ' + (numPlates-1) + ' more...';
2652 11 Sep 14 nicklas 94           for (var plateNo=0; plateNo < numPlates; plateNo++)
2652 11 Sep 14 nicklas 95           {
2652 11 Sep 14 nicklas 96             var libPlate = pool.libPlates[plateNo];
2652 11 Sep 14 nicklas 97             if (plateNo > 0) title += ', ';
2652 11 Sep 14 nicklas 98             title += libPlate.name;
2652 11 Sep 14 nicklas 99           }
2652 11 Sep 14 nicklas 100         }
2652 11 Sep 14 nicklas 101         
4583 21 Sep 17 nicklas 102         var option = new Option(name, pool.id, false, poolNo < 1);
2652 11 Sep 14 nicklas 103         option.title = title;
2652 11 Sep 14 nicklas 104         option.pool = pool;
2652 11 Sep 14 nicklas 105         
2652 11 Sep 14 nicklas 106         poolsList[poolsList.length] = option;
2652 11 Sep 14 nicklas 107       }
2652 11 Sep 14 nicklas 108     }
2652 11 Sep 14 nicklas 109   }
3108 27 Jan 15 nicklas 110
2652 11 Sep 14 nicklas 111   flowcell.presetOnChange = function()
2652 11 Sep 14 nicklas 112   {
2652 11 Sep 14 nicklas 113     var frm = document.forms['reggie'];
2652 11 Sep 14 nicklas 114     var preset = frm.preset.value;
2652 11 Sep 14 nicklas 115     
3623 25 Nov 15 nicklas 116     if (preset == PRESET_NEXTSEQ)
2652 11 Sep 14 nicklas 117     {
2652 11 Sep 14 nicklas 118       frm.num_lanes[0].disabled = true;
2652 11 Sep 14 nicklas 119       frm.num_lanes[1].disabled = false;
2652 11 Sep 14 nicklas 120       frm.num_lanes[2].disabled = true;
2652 11 Sep 14 nicklas 121       frm.num_lanes[1].checked = true;
2652 11 Sep 14 nicklas 122       for (var i = 0; i<frm.pools.length; i++)
2652 11 Sep 14 nicklas 123       {
2652 11 Sep 14 nicklas 124         frm.pools[i].selected = i < 1;
2652 11 Sep 14 nicklas 125       }
2652 11 Sep 14 nicklas 126       frm.read1.value = DEFAULT_READ_NEXTSEQ[0];
2652 11 Sep 14 nicklas 127       frm.indexRead.value = DEFAULT_READ_NEXTSEQ[1];
2652 11 Sep 14 nicklas 128       frm.read2.value = DEFAULT_READ_NEXTSEQ[2];
2652 11 Sep 14 nicklas 129     }
2652 11 Sep 14 nicklas 130     else
2652 11 Sep 14 nicklas 131     {
2652 11 Sep 14 nicklas 132       frm.num_lanes[0].disabled = false;
2652 11 Sep 14 nicklas 133       frm.num_lanes[1].disabled = false;
2652 11 Sep 14 nicklas 134       frm.num_lanes[2].disabled = false;
2652 11 Sep 14 nicklas 135     }
2652 11 Sep 14 nicklas 136     
2652 11 Sep 14 nicklas 137     flowcell.poolsOnChange();
2652 11 Sep 14 nicklas 138   }
2652 11 Sep 14 nicklas 139
2652 11 Sep 14 nicklas 140   flowcell.poolsOnChange = function()
2652 11 Sep 14 nicklas 141   {
2652 11 Sep 14 nicklas 142     poolsAreValid = false;
2652 11 Sep 14 nicklas 143     
2652 11 Sep 14 nicklas 144     var frm = document.forms['reggie'];
2652 11 Sep 14 nicklas 145     var preset = frm.preset.value;
2652 11 Sep 14 nicklas 146     var poolsList = frm.pools;
2652 11 Sep 14 nicklas 147     
2652 11 Sep 14 nicklas 148     var numSelected = 0;
5435 17 May 19 nicklas 149     var invalidPipeline = null;
2652 11 Sep 14 nicklas 150     for (var i = 0; i < poolsList.length; i++)
2652 11 Sep 14 nicklas 151     {
3108 27 Jan 15 nicklas 152       if (poolsList[i].selected) 
3108 27 Jan 15 nicklas 153       {
3108 27 Jan 15 nicklas 154         var pool = poolsList[i].pool;
5435 17 May 19 nicklas 155         if (pool.pipeline && pool.pipeline != 'RNAseq')
3108 27 Jan 15 nicklas 156         {
5435 17 May 19 nicklas 157           invalidPipeline = 'Pool ' + Strings.encodeTags(pool.name+' ('+pool.pipeline)+') is not intended for RNAseq pipeline.';
3108 27 Jan 15 nicklas 158         }
5435 17 May 19 nicklas 159         numSelected++;
3108 27 Jan 15 nicklas 160       }
2652 11 Sep 14 nicklas 161     }
5435 17 May 19 nicklas 162     
2652 11 Sep 14 nicklas 163     Doc.element('numSelected').innerHTML = numSelected + ' selected';
2652 11 Sep 14 nicklas 164     
5435 17 May 19 nicklas 165     if (invalidPipeline) 
5435 17 May 19 nicklas 166     {
5435 17 May 19 nicklas 167       Wizard.setInputStatus('pools', 'invalid', invalidPipeline);
5435 17 May 19 nicklas 168       return;
5435 17 May 19 nicklas 169     }
2652 11 Sep 14 nicklas 170     if (numSelected == 0)
2652 11 Sep 14 nicklas 171     {
2652 11 Sep 14 nicklas 172       Wizard.setInputStatus('pools', 'invalid', 'Must select at least 1 pool.');
2652 11 Sep 14 nicklas 173       return;
2652 11 Sep 14 nicklas 174     }
3108 27 Jan 15 nicklas 175     if (preset == PRESET_NEXTSEQ)
2652 11 Sep 14 nicklas 176     {
3108 27 Jan 15 nicklas 177       if (numSelected > 1)
3108 27 Jan 15 nicklas 178       {
3108 27 Jan 15 nicklas 179         Wizard.setInputStatus('pools', 'invalid', 'Can only use 1 pool with the NextSeq.');
3108 27 Jan 15 nicklas 180         return;
3108 27 Jan 15 nicklas 181       }
2652 11 Sep 14 nicklas 182     }
2652 11 Sep 14 nicklas 183     
2652 11 Sep 14 nicklas 184     poolsAreValid = true;
2652 11 Sep 14 nicklas 185     Wizard.setInputStatus('pools', 'valid');
2652 11 Sep 14 nicklas 186   }
2652 11 Sep 14 nicklas 187   
2652 11 Sep 14 nicklas 188   
2652 11 Sep 14 nicklas 189   flowcell.selectPools = function()
2652 11 Sep 14 nicklas 190   {
2652 11 Sep 14 nicklas 191     var frm = document.forms['reggie'];
2652 11 Sep 14 nicklas 192     if (frm.pools.disabled) return;
2652 11 Sep 14 nicklas 193     
2652 11 Sep 14 nicklas 194     if (subtypePooledLibrary == null)
2652 11 Sep 14 nicklas 195     {
2652 11 Sep 14 nicklas 196       subtypePooledLibrary = Reggie.getSubtypeInfo('POOLED_LIBRARY');
2652 11 Sep 14 nicklas 197     }
5435 17 May 19 nicklas 198     if (annotationTypePipeline == null)
5435 17 May 19 nicklas 199     {
5435 17 May 19 nicklas 200       annotationTypePipeline = Reggie.getAnnotationTypeInfo('PIPELINE');
5435 17 May 19 nicklas 201     }
2652 11 Sep 14 nicklas 202     
3108 27 Jan 15 nicklas 203     newPools = [];
2652 11 Sep 14 nicklas 204     var url = '&resetTemporary=1';
2652 11 Sep 14 nicklas 205     url += '&tmpfilter:INT:itemSubtype='+subtypePooledLibrary.id;
2652 11 Sep 14 nicklas 206     url += '&tmpfilter:DATE:creationEvent.eventDate='+encodeURIComponent('<>');
5435 17 May 19 nicklas 207     url += '&tmpfilter:STRING:'+encodeURIComponent('#')+annotationTypePipeline.id+'=RNAseq';
2652 11 Sep 14 nicklas 208     Dialogs.selectItem('EXTRACT', 'pools', 1, url);
2652 11 Sep 14 nicklas 209   }
2652 11 Sep 14 nicklas 210   
2652 11 Sep 14 nicklas 211   flowcell.setPoolCallback = function(event)
2652 11 Sep 14 nicklas 212   {
2652 11 Sep 14 nicklas 213     var frm = document.forms['reggie'];
2652 11 Sep 14 nicklas 214     var name = event.detail.name;
2652 11 Sep 14 nicklas 215     var id = event.detail.id;
2652 11 Sep 14 nicklas 216     
2652 11 Sep 14 nicklas 217     var poolsList = frm.pools;
2808 15 Oct 14 nicklas 218     var isNew = true;
2652 11 Sep 14 nicklas 219     for (var i = 0; i < poolsList.length; i++)
2652 11 Sep 14 nicklas 220     {
2652 11 Sep 14 nicklas 221       if (poolsList[i].value == id)
2652 11 Sep 14 nicklas 222       {
2652 11 Sep 14 nicklas 223         poolsList[i].selected = true;
2808 15 Oct 14 nicklas 224         isNew = false;
2652 11 Sep 14 nicklas 225       }
2652 11 Sep 14 nicklas 226     }
2652 11 Sep 14 nicklas 227
2808 15 Oct 14 nicklas 228     if (isNew)
2808 15 Oct 14 nicklas 229     {
3108 27 Jan 15 nicklas 230       newPools[newPools.length] = id;
2808 15 Oct 14 nicklas 231     }
2808 15 Oct 14 nicklas 232     
3108 27 Jan 15 nicklas 233     if (event.detail.remaining == 0 && newPools.length > 0)
2808 15 Oct 14 nicklas 234     {
3108 27 Jan 15 nicklas 235       // Get more information about the selected library
3108 27 Jan 15 nicklas 236       var url = '../FlowCell.servlet?ID='+App.getSessionId();
3108 27 Jan 15 nicklas 237       url += '&cmd=GetPoolInfo&pools=' + newPools.join(',');
3108 27 Jan 15 nicklas 238       Wizard.asyncJsonRequest(url, flowcell.manualPoolInfoLoaded);
2808 15 Oct 14 nicklas 239     }
2652 11 Sep 14 nicklas 240   }
2652 11 Sep 14 nicklas 241
3108 27 Jan 15 nicklas 242   flowcell.manualPoolInfoLoaded = function(response)
3108 27 Jan 15 nicklas 243   {
3108 27 Jan 15 nicklas 244     flowcell.poolInfoLoaded(response);
3108 27 Jan 15 nicklas 245     flowcell.poolsOnChange();
3108 27 Jan 15 nicklas 246   }
3108 27 Jan 15 nicklas 247   
2652 11 Sep 14 nicklas 248   flowcell.validateStep1 = function(event)
2652 11 Sep 14 nicklas 249   {
2652 11 Sep 14 nicklas 250     if (!poolsAreValid) event.preventDefault();
2652 11 Sep 14 nicklas 251   }
2652 11 Sep 14 nicklas 252
2652 11 Sep 14 nicklas 253   
2652 11 Sep 14 nicklas 254   flowcell.initializeStep2 = function()
2652 11 Sep 14 nicklas 255   {
2652 11 Sep 14 nicklas 256     var frm = document.forms['reggie'];
3108 27 Jan 15 nicklas 257
3108 27 Jan 15 nicklas 258     // Auto-select either 10µl or 20µl
3108 27 Jan 15 nicklas 259     var maxMolarity = null;
3108 27 Jan 15 nicklas 260     var minMolarity = null;
3108 27 Jan 15 nicklas 261     var poolsList = frm.pools;
3108 27 Jan 15 nicklas 262     for (var i = 0; i < poolsList.length; i++)
3108 27 Jan 15 nicklas 263     {
3108 27 Jan 15 nicklas 264       if (poolsList[i].selected) 
3108 27 Jan 15 nicklas 265       {
3108 27 Jan 15 nicklas 266         var pool = poolsList[i].pool;
3108 27 Jan 15 nicklas 267         if (maxMolarity == null || pool.molarity > maxMolarity)
3108 27 Jan 15 nicklas 268         {
3108 27 Jan 15 nicklas 269           maxMolarity = pool.molarity;
3108 27 Jan 15 nicklas 270         }
3108 27 Jan 15 nicklas 271         if (minMolarity == null || pool.molarity < minMolarity)
3108 27 Jan 15 nicklas 272         {
3108 27 Jan 15 nicklas 273           minMolarity = pool.molarity;
3108 27 Jan 15 nicklas 274         }
3108 27 Jan 15 nicklas 275       }
3108 27 Jan 15 nicklas 276     }
3108 27 Jan 15 nicklas 277
3108 27 Jan 15 nicklas 278     if (Math.abs(maxMolarity - 1) < 0.25 && Math.abs(minMolarity - 1) < 0.25)
3108 27 Jan 15 nicklas 279     {
3108 27 Jan 15 nicklas 280       // Close to 1nM use 20µl instead of 10
3108 27 Jan 15 nicklas 281       Forms.selectListOption(frm.volumeToUseFromPool, '20');
3108 27 Jan 15 nicklas 282     }
3108 27 Jan 15 nicklas 283     
2652 11 Sep 14 nicklas 284     var numFlowCells = Forms.getCheckedRadio(frm.num_flowcells).value;
2652 11 Sep 14 nicklas 285     var url = '../FlowCell.servlet?ID='+App.getSessionId();
2652 11 Sep 14 nicklas 286     url += '&cmd=GetNextAutoGeneratedFlowCellNames&numNames='+numFlowCells;
2652 11 Sep 14 nicklas 287     Wizard.showLoadingAnimation('Loading flow cell information...');
2652 11 Sep 14 nicklas 288     Wizard.asyncJsonRequest(url, flowcell.flowCellsLoaded);
2652 11 Sep 14 nicklas 289   }
2652 11 Sep 14 nicklas 290   
2652 11 Sep 14 nicklas 291   flowcell.flowCellsLoaded = function(response)
2652 11 Sep 14 nicklas 292   {
2652 11 Sep 14 nicklas 293     var frm = document.forms['reggie'];
2652 11 Sep 14 nicklas 294
2652 11 Sep 14 nicklas 295     var names = response.names;
2652 11 Sep 14 nicklas 296     var numFlowCells = names.length;
2652 11 Sep 14 nicklas 297     var numLanes = Forms.getCheckedRadio(frm.num_lanes).value;
2652 11 Sep 14 nicklas 298
2652 11 Sep 14 nicklas 299     // Initialize flowCell->lane->pool array
2652 11 Sep 14 nicklas 300     for (var fcNo = 0; fcNo < numFlowCells; fcNo++)
2652 11 Sep 14 nicklas 301     {
2652 11 Sep 14 nicklas 302       var fc = {};
2652 11 Sep 14 nicklas 303       fc.name = names[fcNo];
2652 11 Sep 14 nicklas 304       fc.lanes = [];
2652 11 Sep 14 nicklas 305       for (var laneNo = 0; laneNo < numLanes; laneNo++)
2652 11 Sep 14 nicklas 306       {
2652 11 Sep 14 nicklas 307         fc.lanes[laneNo] = {};
2652 11 Sep 14 nicklas 308       }
2652 11 Sep 14 nicklas 309       
2652 11 Sep 14 nicklas 310       flowCells[fcNo] = fc;
2652 11 Sep 14 nicklas 311       Doc.element('fc.'+fcNo).innerHTML = Strings.encodeTags(fc.name);
2652 11 Sep 14 nicklas 312       Doc.element('comments.'+fcNo+'.name').innerHTML = Strings.encodeTags(fc.name);
2652 11 Sep 14 nicklas 313     }
2652 11 Sep 14 nicklas 314     
2652 11 Sep 14 nicklas 315     // Hide unused flow cell
2652 11 Sep 14 nicklas 316     if (numFlowCells == 1)
2652 11 Sep 14 nicklas 317     {
2652 11 Sep 14 nicklas 318       Doc.addClass(plate, 'hide-fc-1');
2652 11 Sep 14 nicklas 319       Doc.hide('comments.1');
2652 11 Sep 14 nicklas 320     }
2652 11 Sep 14 nicklas 321
2652 11 Sep 14 nicklas 322     // Hide unused lanes
2652 11 Sep 14 nicklas 323     for (var i = numLanes; i < 8; i++)
2652 11 Sep 14 nicklas 324     {
2652 11 Sep 14 nicklas 325       Doc.hide('lane.'+i);
2652 11 Sep 14 nicklas 326     }
2652 11 Sep 14 nicklas 327
2652 11 Sep 14 nicklas 328     // Generate popup menu for pool selection
2652 11 Sep 14 nicklas 329     var selectPoolHtml = '';  
2652 11 Sep 14 nicklas 330     for (var i = 0; i < frm.pools.length; i++)
2652 11 Sep 14 nicklas 331     {
2652 11 Sep 14 nicklas 332       if (frm.pools[i].selected)
2652 11 Sep 14 nicklas 333       {
2652 11 Sep 14 nicklas 334         var pool = frm.pools[i].pool;
2652 11 Sep 14 nicklas 335         var index = selectedPools.length;
2652 11 Sep 14 nicklas 336         selectedPools[index] = pool;
2652 11 Sep 14 nicklas 337
2981 25 Nov 14 nicklas 338         selectPoolHtml += '<div class="menuitem enabled interactable" id="pool-'+pool.id+'" data-index="'+index+'">';
2652 11 Sep 14 nicklas 339         selectPoolHtml += Strings.encodeTags(pool.name)+'</div>';
2652 11 Sep 14 nicklas 340       }
2652 11 Sep 14 nicklas 341     }
2652 11 Sep 14 nicklas 342     // Add separator
2652 11 Sep 14 nicklas 343     selectPoolHtml += '<div class="menuseparator"></div>';
2652 11 Sep 14 nicklas 344     // Add option for empty lane
2981 25 Nov 14 nicklas 345     selectPoolHtml += '<div class="menuitem enabled interactable" id="pool-none"><i>empty</i>'+'</div>';    
2652 11 Sep 14 nicklas 346     Doc.element('select-pool-all').innerHTML = selectPoolHtml;
2652 11 Sep 14 nicklas 347
3623 25 Nov 15 nicklas 348     // A single pool on all lanes
2652 11 Sep 14 nicklas 349     if (selectedPools.length == 1)
2652 11 Sep 14 nicklas 350     {
2652 11 Sep 14 nicklas 351       var pool = selectedPools[0];
2652 11 Sep 14 nicklas 352       for (var fcNo = 0; fcNo < numFlowCells; fcNo++)
2652 11 Sep 14 nicklas 353       {
2652 11 Sep 14 nicklas 354         for (var laneNo = 0; laneNo < numLanes; laneNo++)
2652 11 Sep 14 nicklas 355         {
2652 11 Sep 14 nicklas 356           flowCells[fcNo].lanes[laneNo] = {'pool': pool, 'defaultPool': pool};
2652 11 Sep 14 nicklas 357         }
2652 11 Sep 14 nicklas 358       }
2652 11 Sep 14 nicklas 359     }
2652 11 Sep 14 nicklas 360     
2652 11 Sep 14 nicklas 361     flowcell.updateFlowCellsMatrix(true);
2652 11 Sep 14 nicklas 362     
2652 11 Sep 14 nicklas 363     Doc.show('gocancel');
2652 11 Sep 14 nicklas 364     Doc.show('goregister');
2652 11 Sep 14 nicklas 365     Wizard.setCurrentStep(2);
2652 11 Sep 14 nicklas 366     
2652 11 Sep 14 nicklas 367     Events.sendChangeEvent('read1');
2652 11 Sep 14 nicklas 368     Events.sendChangeEvent('indexRead');
2652 11 Sep 14 nicklas 369     Events.sendChangeEvent('read2');
2652 11 Sep 14 nicklas 370     frm.read1.focus();
2652 11 Sep 14 nicklas 371
2652 11 Sep 14 nicklas 372   }
2652 11 Sep 14 nicklas 373   
2652 11 Sep 14 nicklas 374   flowcell.readOnChange = function(event)
2652 11 Sep 14 nicklas 375   {
2652 11 Sep 14 nicklas 376     var target = event.currentTarget;
2652 11 Sep 14 nicklas 377     
2652 11 Sep 14 nicklas 378     Wizard.setInputStatus(target.id);
2652 11 Sep 14 nicklas 379
2652 11 Sep 14 nicklas 380     var defaultValue = Data.int(target, 'default-value');
2652 11 Sep 14 nicklas 381     var value = target.value;
2652 11 Sep 14 nicklas 382     if (!defaultValue) Data.set(target, 'default-value', value); // Initalize the default value
2652 11 Sep 14 nicklas 383     
2652 11 Sep 14 nicklas 384     if (value == '')
2652 11 Sep 14 nicklas 385     {
2652 11 Sep 14 nicklas 386       readIsValid[target.id] = false;
2652 11 Sep 14 nicklas 387       Wizard.setInputStatus(target.id, 'invalid', 'Missing');
2652 11 Sep 14 nicklas 388       return;
2652 11 Sep 14 nicklas 389     }
2652 11 Sep 14 nicklas 390     
2652 11 Sep 14 nicklas 391     if (!Numbers.isInteger(value))
2652 11 Sep 14 nicklas 392     {
2652 11 Sep 14 nicklas 393       readIsValid[target.id] = false;
2652 11 Sep 14 nicklas 394       Wizard.setInputStatus(target.id, 'invalid', 'Not a number');
2652 11 Sep 14 nicklas 395       return;
2652 11 Sep 14 nicklas 396     }
2652 11 Sep 14 nicklas 397     
2652 11 Sep 14 nicklas 398     readIsValid[target.id] = true;
2652 11 Sep 14 nicklas 399     if (defaultValue && parseInt(value) != defaultValue)
2652 11 Sep 14 nicklas 400     {
2652 11 Sep 14 nicklas 401       Wizard.setInputStatus(target.id, 'warning', 'Default: ' + defaultValue);
2652 11 Sep 14 nicklas 402     }
2652 11 Sep 14 nicklas 403     else
2652 11 Sep 14 nicklas 404     {
2652 11 Sep 14 nicklas 405       Wizard.setInputStatus(target.id, 'valid');
2652 11 Sep 14 nicklas 406     }
2652 11 Sep 14 nicklas 407   }
2652 11 Sep 14 nicklas 408
2652 11 Sep 14 nicklas 409   flowcell.updateFlowCellsMatrix = function(attachEventHandlers)
2652 11 Sep 14 nicklas 410   {
2652 11 Sep 14 nicklas 411     Wizard.setInputStatus('flowCells');
2652 11 Sep 14 nicklas 412     flowCellsAreValid = false;
2652 11 Sep 14 nicklas 413     
2652 11 Sep 14 nicklas 414     var frm = document.forms['reggie'];
2652 11 Sep 14 nicklas 415     var numFlowCells = Forms.getCheckedRadio(frm.num_flowcells).value;
2652 11 Sep 14 nicklas 416     var numLanes = Forms.getCheckedRadio(frm.num_lanes).value;
2652 11 Sep 14 nicklas 417     var numEmptyLanes = 0;
2652 11 Sep 14 nicklas 418     
2652 11 Sep 14 nicklas 419     for (var fcNo = 0; fcNo < flowCells.length; fcNo++)
2652 11 Sep 14 nicklas 420     {
2652 11 Sep 14 nicklas 421       for (var laneNo = 0; laneNo < flowCells[fcNo].lanes.length; laneNo++)
2652 11 Sep 14 nicklas 422       {
2652 11 Sep 14 nicklas 423         var lane = flowCells[fcNo].lanes[laneNo];
2652 11 Sep 14 nicklas 424         var pool = lane.pool;
2652 11 Sep 14 nicklas 425         
2652 11 Sep 14 nicklas 426         var name = pool ? Strings.encodeTags(pool.name) : '';
2652 11 Sep 14 nicklas 427         if (pool && lane.defaultPool && pool != lane.defaultPool)
2652 11 Sep 14 nicklas 428         {
2652 11 Sep 14 nicklas 429           name = '<span class="nondefault">' + name + '</name>';
2652 11 Sep 14 nicklas 430         }
2652 11 Sep 14 nicklas 431         
2652 11 Sep 14 nicklas 432         Doc.element('lane.'+laneNo+'.'+fcNo).innerHTML = name;
2652 11 Sep 14 nicklas 433         if (attachEventHandlers) 
2652 11 Sep 14 nicklas 434         {
2652 11 Sep 14 nicklas 435           Events.addEventHandler('lane.'+laneNo+'.'+fcNo, 'click', flowcell.selectPool);
2652 11 Sep 14 nicklas 436         }
2652 11 Sep 14 nicklas 437         if (!pool) numEmptyLanes++;
2652 11 Sep 14 nicklas 438       }
2652 11 Sep 14 nicklas 439     }
2652 11 Sep 14 nicklas 440
2652 11 Sep 14 nicklas 441     if (numEmptyLanes >= numFlowCells*numLanes)
2652 11 Sep 14 nicklas 442     {
2652 11 Sep 14 nicklas 443       Wizard.setInputStatus('flowCells', 'invalid', 'All lanes empty');
2652 11 Sep 14 nicklas 444       return;
2652 11 Sep 14 nicklas 445     }
2652 11 Sep 14 nicklas 446     
2652 11 Sep 14 nicklas 447     flowCellsAreValid = true;
2652 11 Sep 14 nicklas 448     if (numEmptyLanes > 0)
2652 11 Sep 14 nicklas 449     {
2652 11 Sep 14 nicklas 450       Wizard.setInputStatus('flowCells', 'warning', numEmptyLanes + ' empty lanes');
2652 11 Sep 14 nicklas 451     }
2652 11 Sep 14 nicklas 452     else
2652 11 Sep 14 nicklas 453     {
2652 11 Sep 14 nicklas 454       Wizard.setInputStatus('flowCells', 'valid');
2652 11 Sep 14 nicklas 455     }
2652 11 Sep 14 nicklas 456   }
2652 11 Sep 14 nicklas 457
2652 11 Sep 14 nicklas 458   
2652 11 Sep 14 nicklas 459   flowcell.selectPool = function(event)
2652 11 Sep 14 nicklas 460   {
2652 11 Sep 14 nicklas 461     var frm = document.forms['reggie'];
2652 11 Sep 14 nicklas 462     if (frm.preset.value == PRESET_NEXTSEQ) return;
2652 11 Sep 14 nicklas 463     
2652 11 Sep 14 nicklas 464     var target = event.currentTarget;
2652 11 Sep 14 nicklas 465     currentFcNo = Data.int(target, 'fc-no');
2652 11 Sep 14 nicklas 466     currentLaneNo = Data.int(target, 'lane-no');
2652 11 Sep 14 nicklas 467     
2652 11 Sep 14 nicklas 468     // Reset 'current' selection
2652 11 Sep 14 nicklas 469     var menu = Doc.element('select-pool');
2652 11 Sep 14 nicklas 470     var selectAll = Doc.element('select-pool-all');
2652 11 Sep 14 nicklas 471     for (var i = 0; i <  selectAll.childNodes.length; i++)
2652 11 Sep 14 nicklas 472     {
2652 11 Sep 14 nicklas 473       Doc.removeClass(selectAll.childNodes[i], 'current');
2652 11 Sep 14 nicklas 474       Doc.removeClass(selectAll.childNodes[i], 'default');
2652 11 Sep 14 nicklas 475     }
2652 11 Sep 14 nicklas 476     menu.style.display = 'block';
2652 11 Sep 14 nicklas 477     
2652 11 Sep 14 nicklas 478     var currentPool = flowCells[currentFcNo].lanes[currentLaneNo].pool;
2652 11 Sep 14 nicklas 479     var defaultPool = flowCells[currentFcNo].lanes[currentLaneNo].defaultPool;
2652 11 Sep 14 nicklas 480     if (currentPool) 
2652 11 Sep 14 nicklas 481     {
2652 11 Sep 14 nicklas 482       Doc.addClass('pool-'+currentPool.id, 'current');
2652 11 Sep 14 nicklas 483     }
2652 11 Sep 14 nicklas 484     if (defaultPool && defaultPool != currentPool)
2652 11 Sep 14 nicklas 485     {
2652 11 Sep 14 nicklas 486       Doc.addClass('pool-'+defaultPool.id, 'default');
2652 11 Sep 14 nicklas 487     }
2652 11 Sep 14 nicklas 488   
2652 11 Sep 14 nicklas 489     var x = event.clientX;
2652 11 Sep 14 nicklas 490     var halfHeight = Math.floor(selectAll.offsetHeight/2)
2652 11 Sep 14 nicklas 491     var y = event.clientY+2; //-halfHeight;
2652 11 Sep 14 nicklas 492
2652 11 Sep 14 nicklas 493     var scroll = 0;
2652 11 Sep 14 nicklas 494     
2652 11 Sep 14 nicklas 495     // Position the selection div
2652 11 Sep 14 nicklas 496     selectAll.scrollTop = scroll;
2652 11 Sep 14 nicklas 497     menu.style.left = (x)+'px';
2652 11 Sep 14 nicklas 498     menu.style.top = (y)+'px';
2652 11 Sep 14 nicklas 499     event.stopPropagation();
2652 11 Sep 14 nicklas 500   }
2652 11 Sep 14 nicklas 501
2652 11 Sep 14 nicklas 502   flowcell.onPoolSelected = function(event)
2652 11 Sep 14 nicklas 503   {
2652 11 Sep 14 nicklas 504     var optionId = event.target.id;
2652 11 Sep 14 nicklas 505     var pool = null;
2652 11 Sep 14 nicklas 506     var index = Data.int(event.target, 'index', -1);
2652 11 Sep 14 nicklas 507     if (index >= 0)
2652 11 Sep 14 nicklas 508     {
2652 11 Sep 14 nicklas 509       pool = selectedPools[index];
2652 11 Sep 14 nicklas 510     }
2652 11 Sep 14 nicklas 511     flowCells[currentFcNo].lanes[currentLaneNo].pool = pool;
2652 11 Sep 14 nicklas 512     flowcell.updateFlowCellsMatrix();
2652 11 Sep 14 nicklas 513   }
2796 13 Oct 14 nicklas 514   
2796 13 Oct 14 nicklas 515   flowcell.hidePoolSelection = function()
2796 13 Oct 14 nicklas 516   {
2796 13 Oct 14 nicklas 517     Doc.hide('select-pool');
2796 13 Oct 14 nicklas 518   }
2652 11 Sep 14 nicklas 519
2652 11 Sep 14 nicklas 520   flowcell.validateStep2 = function(event)
2652 11 Sep 14 nicklas 521   {
2652 11 Sep 14 nicklas 522     var valid = flowCellsAreValid;
2652 11 Sep 14 nicklas 523     valid &= readIsValid['read1'];
2652 11 Sep 14 nicklas 524     valid &= readIsValid['indexRead'];
2652 11 Sep 14 nicklas 525     valid &= readIsValid['read2'];
2652 11 Sep 14 nicklas 526     
2652 11 Sep 14 nicklas 527     if (!valid)
2652 11 Sep 14 nicklas 528     {
2652 11 Sep 14 nicklas 529       event.preventDefault();
2652 11 Sep 14 nicklas 530     }  
2652 11 Sep 14 nicklas 531   }
2652 11 Sep 14 nicklas 532   
2652 11 Sep 14 nicklas 533   flowcell.submit = function()
2652 11 Sep 14 nicklas 534   {
2652 11 Sep 14 nicklas 535     var frm = document.forms['reggie'];
3108 27 Jan 15 nicklas 536     var volumeToUseFromPool = parseFloat(frm.volumeToUseFromPool.value);
2652 11 Sep 14 nicklas 537
2652 11 Sep 14 nicklas 538     var submitInfo = {};
2652 11 Sep 14 nicklas 539     submitInfo.flowCellType = frm.preset.value;
2652 11 Sep 14 nicklas 540     submitInfo.read1 = parseInt(frm.read1.value);
2652 11 Sep 14 nicklas 541     submitInfo.indexRead = parseInt(frm.indexRead.value);
2652 11 Sep 14 nicklas 542     submitInfo.read2 = parseInt(frm.read2.value);
2652 11 Sep 14 nicklas 543     submitInfo.flowCells = flowCells;
2652 11 Sep 14 nicklas 544     
2652 11 Sep 14 nicklas 545     // Calculate volume to use for each pool
2652 11 Sep 14 nicklas 546     for (var fcNo = 0; fcNo < flowCells.length; fcNo++)
2652 11 Sep 14 nicklas 547     {
2652 11 Sep 14 nicklas 548       var flowCell = flowCells[fcNo];
2652 11 Sep 14 nicklas 549       flowCell.comment = frm['comments.'+fcNo].value;
2652 11 Sep 14 nicklas 550       for (var laneNo = 0; laneNo < flowCell.lanes.length; laneNo++)
2652 11 Sep 14 nicklas 551       {
2652 11 Sep 14 nicklas 552         var lane = flowCell.lanes[laneNo];
2652 11 Sep 14 nicklas 553         lane.defaultPool = null; // Do not need to submit this information
2652 11 Sep 14 nicklas 554         var pool = lane.pool;
2652 11 Sep 14 nicklas 555         if (pool != null)
2652 11 Sep 14 nicklas 556         {
2652 11 Sep 14 nicklas 557           pool.count = pool.count ? pool.count+1 : 1;
2652 11 Sep 14 nicklas 558         }
2652 11 Sep 14 nicklas 559       }
2652 11 Sep 14 nicklas 560     }
2652 11 Sep 14 nicklas 561     
2652 11 Sep 14 nicklas 562     for (var poolNo = 0; poolNo < selectedPools.length; poolNo++)
2652 11 Sep 14 nicklas 563     {
2652 11 Sep 14 nicklas 564       var pool = selectedPools[poolNo];
2652 11 Sep 14 nicklas 565       if (pool != null)
2652 11 Sep 14 nicklas 566       {
3108 27 Jan 15 nicklas 567         pool.usedVolume = volumeToUseFromPool / pool.count;
2652 11 Sep 14 nicklas 568       }
2652 11 Sep 14 nicklas 569     }
2652 11 Sep 14 nicklas 570   
2652 11 Sep 14 nicklas 571     var url = '../FlowCell.servlet?ID='+App.getSessionId();
2652 11 Sep 14 nicklas 572     url += '&cmd=CreateFlowCells';
2652 11 Sep 14 nicklas 573     Wizard.showLoadingAnimation('Performing registration...');
2652 11 Sep 14 nicklas 574     Wizard.asyncJsonRequest(url, flowcell.submissionResults, 'POST', JSON.stringify(submitInfo));
2652 11 Sep 14 nicklas 575   }
2652 11 Sep 14 nicklas 576   
2652 11 Sep 14 nicklas 577   flowcell.submissionResults = function(response)
2652 11 Sep 14 nicklas 578   {
2652 11 Sep 14 nicklas 579     Wizard.showFinalMessage(response.messages);
2652 11 Sep 14 nicklas 580     Doc.show('gorestart');
2652 11 Sep 14 nicklas 581   }
2652 11 Sep 14 nicklas 582
2652 11 Sep 14 nicklas 583   return flowcell;
2652 11 Sep 14 nicklas 584 }();
2652 11 Sep 14 nicklas 585
2652 11 Sep 14 nicklas 586 Doc.onLoad(FlowCell.initPage);
2652 11 Sep 14 nicklas 587