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

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