extensions/net.sf.basedb.meludi/trunk/resources/libprep/assign_barcode.js

Code
Comments
Other
Rev Date Author Line
3449 28 Jul 15 olle 1 var Barcode = function()
3449 28 Jul 15 olle 2 {
3449 28 Jul 15 olle 3   var barcode = {};
3449 28 Jul 15 olle 4   var debug = 0;
3449 28 Jul 15 olle 5   
3449 28 Jul 15 olle 6   var barcodesByName = [];
3449 28 Jul 15 olle 7
3449 28 Jul 15 olle 8   // Page initialization
3449 28 Jul 15 olle 9   barcode.initPage = function()
3449 28 Jul 15 olle 10   {
3449 28 Jul 15 olle 11     // Step 1
3449 28 Jul 15 olle 12     Events.addEventHandler('step-1', 'wizard-validate', barcode.validateStep1);
3449 28 Jul 15 olle 13     Events.addEventHandler('bioplate', 'change', barcode.bioPlateOnChange);
3449 28 Jul 15 olle 14     
3449 28 Jul 15 olle 15     // Step 2
3449 28 Jul 15 olle 16     Events.addEventHandler('step-2', 'wizard-initialize', barcode.initializeStep2);
3449 28 Jul 15 olle 17     Events.addEventHandler('step-2', 'wizard-validate', barcode.validateStep2);
3449 28 Jul 15 olle 18     Events.addEventHandler('pool_schema', 'change', barcode.poolSchemaOnChange);
3449 28 Jul 15 olle 19     Events.addEventHandler('barcode_variant', 'change', barcode.barcodeVariantOnChange);
3449 28 Jul 15 olle 20     var wells = document.getElementsByClassName('well');
3449 28 Jul 15 olle 21     for (var wellNo = 0; wellNo < wells.length; wellNo++)
3449 28 Jul 15 olle 22     {
3449 28 Jul 15 olle 23       Events.addEventHandler(wells[wellNo], 'click', barcode.selectBarcode);
3449 28 Jul 15 olle 24     }
3449 28 Jul 15 olle 25     Events.addEventHandler('select-barcode', 'click', barcode.barcodeSelected);
3449 28 Jul 15 olle 26     Events.addEventHandler('wizard', 'click', barcode.hideBarcodeSelection);
3449 28 Jul 15 olle 27
3449 28 Jul 15 olle 28     // Navigation
3449 28 Jul 15 olle 29     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
3449 28 Jul 15 olle 30     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
3449 28 Jul 15 olle 31     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
3449 28 Jul 15 olle 32     Buttons.addClickHandler('goregister', Wizard.goRegister);
3449 28 Jul 15 olle 33     
3449 28 Jul 15 olle 34     // Final registration
3449 28 Jul 15 olle 35     Events.addEventHandler('wizard', 'wizard-submit', barcode.submit);
3449 28 Jul 15 olle 36
3449 28 Jul 15 olle 37 /*
3449 28 Jul 15 olle 38     var url = '../LibPrep.servlet?ID='+App.getSessionId();
3449 28 Jul 15 olle 39     url += '&cmd=GetCDNAPlatesForBarcoding';    
3449 28 Jul 15 olle 40     Wizard.showLoadingAnimation('Loading cDNA plates...');
3449 28 Jul 15 olle 41     Wizard.asyncJsonRequest(url, barcode.initializeStep1);
3449 28 Jul 15 olle 42 */
3449 28 Jul 15 olle 43     var url = '../LibPrep.servlet?ID='+App.getSessionId();
3449 28 Jul 15 olle 44 /*
3449 28 Jul 15 olle 45     url += '&cmd=GetDNAPlatesForBarcoding';
3449 28 Jul 15 olle 46 */
3449 28 Jul 15 olle 47     // Temporary plate selection for demonstration purposes
3449 28 Jul 15 olle 48     url += '&cmd=GetLibraryPlatesForLibPrep';
3449 28 Jul 15 olle 49     Wizard.showLoadingAnimation('Loading DNA plates...');
3449 28 Jul 15 olle 50     Wizard.asyncJsonRequest(url, barcode.initializeStep1);
3449 28 Jul 15 olle 51     
3449 28 Jul 15 olle 52     var url = '../LibPrep.servlet?ID='+App.getSessionId();
3449 28 Jul 15 olle 53     url += '&cmd=GetAllBarcodeInfo';
3449 28 Jul 15 olle 54     Wizard.asyncJsonRequest(url, barcode.barcodesLoaded);
3449 28 Jul 15 olle 55   }
3449 28 Jul 15 olle 56
3449 28 Jul 15 olle 57
3449 28 Jul 15 olle 58   barcode.initializeStep1 = function(response)
3449 28 Jul 15 olle 59   {
3449 28 Jul 15 olle 60     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 61
3449 28 Jul 15 olle 62     var bioplates = response.bioplates;
3449 28 Jul 15 olle 63     var plates = frm.bioplate;
3449 28 Jul 15 olle 64     if (bioplates.length > 0)
3449 28 Jul 15 olle 65     {
3449 28 Jul 15 olle 66       for (var i=0; i < bioplates.length; i++)
3449 28 Jul 15 olle 67       {
3449 28 Jul 15 olle 68         var bioplate = bioplates[i];
3449 28 Jul 15 olle 69         var option = new Option(bioplate.name, bioplate.id);
3449 28 Jul 15 olle 70         option.bioplate = bioplate;
3449 28 Jul 15 olle 71         plates.options[plates.length] = option;
3449 28 Jul 15 olle 72       }
3449 28 Jul 15 olle 73     }
3449 28 Jul 15 olle 74     else
3449 28 Jul 15 olle 75     {
3449 28 Jul 15 olle 76 /*
3449 28 Jul 15 olle 77       Wizard.setFatalError('No cDNA bioplates available for processing.');
3449 28 Jul 15 olle 78 */
3449 28 Jul 15 olle 79       Wizard.setFatalError('No DNA bioplates available for processing.');
3449 28 Jul 15 olle 80       return;
3449 28 Jul 15 olle 81     }
3449 28 Jul 15 olle 82     
3449 28 Jul 15 olle 83     bioplateIsValid = true;
3449 28 Jul 15 olle 84     Wizard.setInputStatus('bioplate', 'valid');
3449 28 Jul 15 olle 85     Events.sendChangeEvent('bioplate');
3449 28 Jul 15 olle 86
3449 28 Jul 15 olle 87     Doc.show('step-1');
3449 28 Jul 15 olle 88     Doc.show('gonext');
3449 28 Jul 15 olle 89   }
3449 28 Jul 15 olle 90   
3449 28 Jul 15 olle 91   barcode.bioPlateOnChange = function()
3449 28 Jul 15 olle 92   {
3449 28 Jul 15 olle 93     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 94     var bioplate = frm.bioplate[frm.bioplate.selectedIndex].bioplate;
3449 28 Jul 15 olle 95     Doc.element('dnaComments').innerHTML = Strings.encodeTags(bioplate.comments);
3449 28 Jul 15 olle 96   }
3449 28 Jul 15 olle 97
3449 28 Jul 15 olle 98   barcode.barcodesLoaded = function(response)
3449 28 Jul 15 olle 99   {
3449 28 Jul 15 olle 100     var barcodes = response.barcodes
3449 28 Jul 15 olle 101     var selectBarcodeHtml = '';
3449 28 Jul 15 olle 102     
3449 28 Jul 15 olle 103     for (var i = 0; i < barcodes.length; i++)
3449 28 Jul 15 olle 104     {
3449 28 Jul 15 olle 105 /*
3449 28 Jul 15 olle 106       if (i % 8 == 0 && i > 0)
3449 28 Jul 15 olle 107 */
3449 28 Jul 15 olle 108       if (i == 8)
3449 28 Jul 15 olle 109       {
3449 28 Jul 15 olle 110         selectBarcodeHtml += '<div class="menuseparator"></div>';
3449 28 Jul 15 olle 111       }
3449 28 Jul 15 olle 112       var barcode = barcodes[i];
3449 28 Jul 15 olle 113       barcodesByName[barcode.name] = barcode;
3449 28 Jul 15 olle 114       selectBarcodeHtml += '<div class="menuitem interactable enabled" id="bc-'+barcode.id+'" data-barcode-name="'+Strings.encodeTags(barcode.name)+'">';
3449 28 Jul 15 olle 115       selectBarcodeHtml += Strings.encodeTags(barcode.name)+'</div>';
3449 28 Jul 15 olle 116     }
3449 28 Jul 15 olle 117     Doc.element('select-barcode-all').innerHTML = selectBarcodeHtml;
3449 28 Jul 15 olle 118   }
3449 28 Jul 15 olle 119
3449 28 Jul 15 olle 120   barcode.validateStep1 = function(event)
3449 28 Jul 15 olle 121   {}
3449 28 Jul 15 olle 122
3449 28 Jul 15 olle 123   barcode.initializeStep2 = function()
3449 28 Jul 15 olle 124   {
3449 28 Jul 15 olle 125     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 126
3449 28 Jul 15 olle 127 /*
3449 28 Jul 15 olle 128     var url = '../LibPrep.servlet?ID='+App.getSessionId();
3449 28 Jul 15 olle 129     url += '&cmd=GetCDnaInfoForPlate&bioplate='+frm.bioplate.value;  
3449 28 Jul 15 olle 130     Wizard.showLoadingAnimation('Loading cDNA bioplate information...');
3449 28 Jul 15 olle 131     Wizard.asyncJsonRequest(url, barcode.dnaInfoLoaded);
3449 28 Jul 15 olle 132 */
3449 28 Jul 15 olle 133     var url = '../LibPrep.servlet?ID='+App.getSessionId();
3449 28 Jul 15 olle 134     url += '&cmd=GetDnaInfoForPlate&bioplate='+frm.bioplate.value;  
3449 28 Jul 15 olle 135     Wizard.showLoadingAnimation('Loading DNA bioplate information...');
3449 28 Jul 15 olle 136     Wizard.asyncJsonRequest(url, barcode.dnaInfoLoaded);
3449 28 Jul 15 olle 137   }
3449 28 Jul 15 olle 138   
3449 28 Jul 15 olle 139   barcode.dnaInfoLoaded = function(response)
3449 28 Jul 15 olle 140   {
3449 28 Jul 15 olle 141     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 142     var dnaPlate = frm.bioplate[frm.bioplate.selectedIndex].bioplate;
3449 28 Jul 15 olle 143
3449 28 Jul 15 olle 144     var schema = PoolSchema.getById(dnaPlate.poolSchema);
3449 28 Jul 15 olle 145     PoolSchema.initList(frm.pool_schema, schema.id, 'manual');
3449 28 Jul 15 olle 146     PoolSchema.initVariantList(frm.barcode_variant, schema, dnaPlate.barcodeVariant);
3449 28 Jul 15 olle 147     
3449 28 Jul 15 olle 148     var list = response.dna;
3449 28 Jul 15 olle 149     // Pre-process the return DNA items
3449 28 Jul 15 olle 150     for (var i = 0; i < list.length; i++)
3449 28 Jul 15 olle 151     {
3449 28 Jul 15 olle 152       barcode.checkAndPreProcessDna(list[i]);
3449 28 Jul 15 olle 153     }
3449 28 Jul 15 olle 154     
3449 28 Jul 15 olle 155     barcode.viewAsPlate(list, schema);
3449 28 Jul 15 olle 156     Wizard.keepSessionAlive();
3449 28 Jul 15 olle 157
3449 28 Jul 15 olle 158     Wizard.setCurrentStep(2);
3449 28 Jul 15 olle 159     Doc.show('goregister');
3449 28 Jul 15 olle 160     Doc.show('gocancel');
3449 28 Jul 15 olle 161   }
3449 28 Jul 15 olle 162
3449 28 Jul 15 olle 163   
3449 28 Jul 15 olle 164   barcode.checkAndPreProcessDna = function(dna)
3449 28 Jul 15 olle 165   {
3449 28 Jul 15 olle 166     // Set the 'stratagene'/'external' flag
3449 28 Jul 15 olle 167     dna.stratagene = Meludi.isStratagene(dna.name);
3449 28 Jul 15 olle 168     dna.external = Meludi.isExternal(dna.name);
3449 28 Jul 15 olle 169   }
3449 28 Jul 15 olle 170
3449 28 Jul 15 olle 171   barcode.viewAsPlate = function(list, schema)
3449 28 Jul 15 olle 172   {
3449 28 Jul 15 olle 173     Plate.init(8, 12, schema, WellPainter);
3449 28 Jul 15 olle 174
3449 28 Jul 15 olle 175     for (var i = 0; i < list.length; i++)
3449 28 Jul 15 olle 176     {
3449 28 Jul 15 olle 177       var dna = list[i];
3449 28 Jul 15 olle 178       var well = dna.bioWell;
3449 28 Jul 15 olle 179       Plate.getWell(well.row, well.column).setExtract(dna);
3449 28 Jul 15 olle 180     }
3449 28 Jul 15 olle 181     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 182     
3449 28 Jul 15 olle 183     var barcodeVariant = PoolSchema.getBarcodeVariantByName(schema, frm.barcode_variant.value);
3449 28 Jul 15 olle 184     barcode.assignSchemaDefinedBarcodeVariant(schema, barcodeVariant);
3449 28 Jul 15 olle 185     
3449 28 Jul 15 olle 186     WellPainter.barcodeVariant = barcodeVariant;
3449 28 Jul 15 olle 187     Plate.paint(Plate.getWells());
3449 28 Jul 15 olle 188     PoolSchema.buildPoolTableRow(schema, 12, false);
3449 28 Jul 15 olle 189   }
3449 28 Jul 15 olle 190
3449 28 Jul 15 olle 191   barcode.assignSchemaDefinedBarcodeVariant = function(schema, barcodeVariant)
3449 28 Jul 15 olle 192   {
3449 28 Jul 15 olle 193     var wells = Plate.getWells();
3449 28 Jul 15 olle 194     for (var i = 0; i < wells.length; i++)
3449 28 Jul 15 olle 195     {
3449 28 Jul 15 olle 196       var well = wells[i];
3449 28 Jul 15 olle 197       var row = well.row;
3449 28 Jul 15 olle 198       var column = well.column;
3449 28 Jul 15 olle 199       var dna = well.extract;
3449 28 Jul 15 olle 200       if (dna)
3449 28 Jul 15 olle 201       {
3449 28 Jul 15 olle 202 /*
3449 28 Jul 15 olle 203         var indexSet = barcodeVariant ? barcodeVariant.indexSets[well.column] : null;
3449 28 Jul 15 olle 204         var barcode = null;
3449 28 Jul 15 olle 205         if (indexSet)
3449 28 Jul 15 olle 206         {
3449 28 Jul 15 olle 207           var barcodeName = indexSet.barcodes[well.row];
3449 28 Jul 15 olle 208 //alert("assign_barcode.js::assignSchemaDefinedBarcodeVariant(): i = " + i + " well = " + well + " barcodeName = " + barcodeName);
3449 28 Jul 15 olle 209           barcode = barcodesByName[barcodeName];
3449 28 Jul 15 olle 210         }
3449 28 Jul 15 olle 211         dna.barcode = barcode;
3449 28 Jul 15 olle 212         dna.defaultBarcode = barcode;
3449 28 Jul 15 olle 213 */
3449 28 Jul 15 olle 214         // Illumina Index 1 Primers
3449 28 Jul 15 olle 215         var barcode = null;
3449 28 Jul 15 olle 216         var barcodeName = 'A7';
3449 28 Jul 15 olle 217         if (column < 9)
3449 28 Jul 15 olle 218         {
3449 28 Jul 15 olle 219           barcodeName += '0';
3449 28 Jul 15 olle 220         }
3449 28 Jul 15 olle 221         barcodeName += (column + 1);
3449 28 Jul 15 olle 222         barcode = barcodesByName[barcodeName];
3449 28 Jul 15 olle 223         dna.barcode1 = barcode;
3449 28 Jul 15 olle 224         dna.defaultBarcode1 = barcode;
3449 28 Jul 15 olle 225
3449 28 Jul 15 olle 226         // Illumina Index 2 Primers
3449 28 Jul 15 olle 227         barcode = null;
3449 28 Jul 15 olle 228         barcodeName = 'A50';
3449 28 Jul 15 olle 229         barcodeName += (row + 1);
3449 28 Jul 15 olle 230         barcode = barcodesByName[barcodeName];
3449 28 Jul 15 olle 231         dna.barcode2 = barcode;
3449 28 Jul 15 olle 232         dna.defaultBarcode2 = barcode;
3449 28 Jul 15 olle 233         
3449 28 Jul 15 olle 234         well.duplicate = false;
3449 28 Jul 15 olle 235       }
3449 28 Jul 15 olle 236     }
3449 28 Jul 15 olle 237   }
3449 28 Jul 15 olle 238   
3449 28 Jul 15 olle 239   barcode.poolSchemaOnChange = function()
3449 28 Jul 15 olle 240   {
3449 28 Jul 15 olle 241     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 242     var schema = PoolSchema.getById(frm.pool_schema.value);
3449 28 Jul 15 olle 243     Plate.setPoolSchema(schema);
3449 28 Jul 15 olle 244     PoolSchema.initVariantList(frm.barcode_variant, schema);
3449 28 Jul 15 olle 245     
3449 28 Jul 15 olle 246     var barcodeVariant = PoolSchema.getBarcodeVariantByName(schema, frm.barcode_variant.value);
3449 28 Jul 15 olle 247     barcode.assignSchemaDefinedBarcodeVariant(schema, barcodeVariant);
3449 28 Jul 15 olle 248     
3449 28 Jul 15 olle 249     WellPainter.barcodeVariant = barcodeVariant;
3449 28 Jul 15 olle 250     Plate.paint(Plate.getWells());
3449 28 Jul 15 olle 251     PoolSchema.buildPoolTableRow(schema, 12, false);
3449 28 Jul 15 olle 252   }
3449 28 Jul 15 olle 253
3449 28 Jul 15 olle 254   barcode.barcodeVariantOnChange = function()
3449 28 Jul 15 olle 255   {
3449 28 Jul 15 olle 256     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 257     var schema = PoolSchema.getById(frm.pool_schema.value);
3449 28 Jul 15 olle 258     var barcodeVariant = PoolSchema.getBarcodeVariantByName(schema, frm.barcode_variant.value);
3449 28 Jul 15 olle 259     
3449 28 Jul 15 olle 260     barcode.assignSchemaDefinedBarcodeVariant(schema, barcodeVariant);
3449 28 Jul 15 olle 261
3449 28 Jul 15 olle 262     WellPainter.barcodeVariant = barcodeVariant;
3449 28 Jul 15 olle 263     Plate.paint(Plate.getWells());
3449 28 Jul 15 olle 264   }
3449 28 Jul 15 olle 265
3449 28 Jul 15 olle 266   var currentWell;
3449 28 Jul 15 olle 267   var lastSelectedBarcode;
3449 28 Jul 15 olle 268   barcode.selectBarcode = function(event)
3449 28 Jul 15 olle 269   {
3449 28 Jul 15 olle 270     var row = Data.int(event.currentTarget, 'row');
3449 28 Jul 15 olle 271     var column = Data.int(event.currentTarget, 'col');
3449 28 Jul 15 olle 272
3449 28 Jul 15 olle 273     // Locate the barcode selection div so that the current
3449 28 Jul 15 olle 274     // barcode is positioned next to the current mouse position
3449 28 Jul 15 olle 275     // Initially set it to the right of the mouse so that the
3449 28 Jul 15 olle 276     // center is vertically aligned
3449 28 Jul 15 olle 277     
3449 28 Jul 15 olle 278     currentWell = Plate.getWell(row, column);
3449 28 Jul 15 olle 279     var dna = currentWell.extract;
3449 28 Jul 15 olle 280     var scroll = 0;
3449 28 Jul 15 olle 281     if (dna)
3449 28 Jul 15 olle 282     {
3449 28 Jul 15 olle 283       // Reset 'current' selection
3449 28 Jul 15 olle 284       var menu = Doc.element('select-barcode');
3449 28 Jul 15 olle 285       var selectAll = Doc.element('select-barcode-all');
3449 28 Jul 15 olle 286       for (var i = 0; i <  selectAll.childNodes.length; i++)
3449 28 Jul 15 olle 287       {
3449 28 Jul 15 olle 288         Doc.removeClass(selectAll.childNodes[i], 'current');
3449 28 Jul 15 olle 289       }
3449 28 Jul 15 olle 290       menu.style.display = 'block';
3449 28 Jul 15 olle 291
3449 28 Jul 15 olle 292       var x = event.clientX+1;
3449 28 Jul 15 olle 293       var halfHeight = Math.floor(selectAll.offsetHeight/2)
3449 28 Jul 15 olle 294       var y = event.clientY-halfHeight;
3449 28 Jul 15 olle 295       var scroll = 0;
3449 28 Jul 15 olle 296       var barcodeDiv;
3449 28 Jul 15 olle 297       
3449 28 Jul 15 olle 298       var useBarcode = dna.barcode || lastSelectedBarcode;
3449 28 Jul 15 olle 299       if (useBarcode)
3449 28 Jul 15 olle 300       {
3449 28 Jul 15 olle 301         var barcodeDiv = Doc.element('bc-'+useBarcode.id);
3449 28 Jul 15 olle 302         if (!dna.barcode && barcodeDiv.nextSibling) barcodeDiv = barcodeDiv.nextSibling;
3449 28 Jul 15 olle 303         // Try to scroll the current barcode so that it's baseline is at the center of the div
3449 28 Jul 15 olle 304         scroll = barcodeDiv.offsetTop + barcodeDiv.offsetHeight - halfHeight;
3449 28 Jul 15 olle 305         if (scroll < 0) 
3449 28 Jul 15 olle 306         {
3449 28 Jul 15 olle 307           // We get a negative scroll for the first few elements, shift the
3449 28 Jul 15 olle 308           // entire selection div down instead
3449 28 Jul 15 olle 309           y -= scroll;
3449 28 Jul 15 olle 310           scroll = 0;
3449 28 Jul 15 olle 311         }
3449 28 Jul 15 olle 312         else if (scroll > selectAll.scrollHeight - selectAll.offsetHeight)
3449 28 Jul 15 olle 313         {
3449 28 Jul 15 olle 314           // We get a too large scroll value for the last few elements, shift
3449 28 Jul 15 olle 315           // the entire selection div up instead
3449 28 Jul 15 olle 316           y -= scroll - (selectAll.scrollHeight - selectAll.offsetHeight);
3449 28 Jul 15 olle 317           scroll = selectAll.scrollHeight - selectAll.offsetHeight;
3449 28 Jul 15 olle 318         }
3449 28 Jul 15 olle 319         if (dna.barcode)
3449 28 Jul 15 olle 320         {
3449 28 Jul 15 olle 321           Doc.addClass(barcodeDiv, 'current');
3449 28 Jul 15 olle 322         }
3449 28 Jul 15 olle 323       }
3449 28 Jul 15 olle 324       
3449 28 Jul 15 olle 325       // Default barcode
3449 28 Jul 15 olle 326       if (dna.defaultBarcode && dna.defaultBarcode != dna.barcode)
3449 28 Jul 15 olle 327       {
3449 28 Jul 15 olle 328         var selectDefault = Doc.element('select-barcode-default');
3449 28 Jul 15 olle 329         Data.set(selectDefault, 'barcode-name', dna.defaultBarcode.name);
3449 28 Jul 15 olle 330         selectDefault.innerHTML = 'Default: ' + Strings.encodeTags(dna.defaultBarcode.name);
3449 28 Jul 15 olle 331         Doc.show('select-barcode-default');
3449 28 Jul 15 olle 332         Doc.show('select-barcode-default-separator');
3449 28 Jul 15 olle 333       }
3449 28 Jul 15 olle 334       else
3449 28 Jul 15 olle 335       {
3449 28 Jul 15 olle 336         Doc.hide('select-barcode-default');
3449 28 Jul 15 olle 337         Doc.hide('select-barcode-default-separator');
3449 28 Jul 15 olle 338       }
3449 28 Jul 15 olle 339       
3449 28 Jul 15 olle 340       // Position the selection div
3449 28 Jul 15 olle 341       selectAll.scrollTop = scroll;
3449 28 Jul 15 olle 342       menu.style.left = (x)+'px';
3449 28 Jul 15 olle 343       menu.style.top = (y)+'px';
3449 28 Jul 15 olle 344       event.stopPropagation();
3449 28 Jul 15 olle 345     }
3449 28 Jul 15 olle 346   }
3449 28 Jul 15 olle 347
3449 28 Jul 15 olle 348   barcode.barcodeSelected = function(event)
3449 28 Jul 15 olle 349   {
3449 28 Jul 15 olle 350     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 351     var schema = PoolSchema.getById(frm.pool_schema.value);
3449 28 Jul 15 olle 352     var target = event.target;
3449 28 Jul 15 olle 353     if (currentWell && currentWell.extract)
3449 28 Jul 15 olle 354     {
3449 28 Jul 15 olle 355       lastSelectedBarcode = barcodesByName[Data.get(target, 'barcode-name')];
3449 28 Jul 15 olle 356       currentWell.extract.barcode = lastSelectedBarcode;
3449 28 Jul 15 olle 357       var poolNum = schema.getPoolNumForColumn(currentWell.column);
3449 28 Jul 15 olle 358       if (poolNum >= 0) 
3449 28 Jul 15 olle 359       {
3449 28 Jul 15 olle 360         barcode.checkDuplicateBarcode(poolNum);
3449 28 Jul 15 olle 361         Plate.paint(schema.getWellsInPool(Plate, poolNum));
3449 28 Jul 15 olle 362       }
3449 28 Jul 15 olle 363       else
3449 28 Jul 15 olle 364       {
3449 28 Jul 15 olle 365         Plate.paint([currentWell]);
3449 28 Jul 15 olle 366       }
3449 28 Jul 15 olle 367     }
3449 28 Jul 15 olle 368   }
3449 28 Jul 15 olle 369   
3449 28 Jul 15 olle 370   barcode.hideBarcodeSelection = function()
3449 28 Jul 15 olle 371   {
3449 28 Jul 15 olle 372     Doc.hide('select-barcode');
3449 28 Jul 15 olle 373   }
3449 28 Jul 15 olle 374   
3449 28 Jul 15 olle 375   barcode.checkDuplicateBarcode = function(poolNum)
3449 28 Jul 15 olle 376   {
3449 28 Jul 15 olle 377     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 378     var schema = PoolSchema.getById(frm.pool_schema.value);
3449 28 Jul 15 olle 379
3449 28 Jul 15 olle 380     var wells = schema.getWellsInPool(Plate, poolNum);
3449 28 Jul 15 olle 381     var wellByBarcodeName = [];
3449 28 Jul 15 olle 382     for (var i = 0; i < wells.length; i++)
3449 28 Jul 15 olle 383     {
3449 28 Jul 15 olle 384       var well = wells[i];
3449 28 Jul 15 olle 385       var dna = well.extract;
3449 28 Jul 15 olle 386       if (dna && dna.barcode)
3449 28 Jul 15 olle 387       {
3449 28 Jul 15 olle 388         if (wellByBarcodeName[dna.barcode.name])
3449 28 Jul 15 olle 389         {
3449 28 Jul 15 olle 390           well.duplicate = true;
3449 28 Jul 15 olle 391           wellByBarcodeName[dna.barcode.name].duplicate = true;
3449 28 Jul 15 olle 392         }
3449 28 Jul 15 olle 393         else
3449 28 Jul 15 olle 394         {
3449 28 Jul 15 olle 395           wellByBarcodeName[dna.barcode.name] = well;
3449 28 Jul 15 olle 396           well.duplicate = false;
3449 28 Jul 15 olle 397         }
3449 28 Jul 15 olle 398       }
3449 28 Jul 15 olle 399     }
3449 28 Jul 15 olle 400   }
3449 28 Jul 15 olle 401
3449 28 Jul 15 olle 402   barcode.validateStep2 = function(event)
3449 28 Jul 15 olle 403   {
3449 28 Jul 15 olle 404     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 405
3449 28 Jul 15 olle 406     var wells = Plate.getWells();
3449 28 Jul 15 olle 407     var numErrors = 0;
3449 28 Jul 15 olle 408     var numWarnings = 0;
3449 28 Jul 15 olle 409     var numDna = 0;
3449 28 Jul 15 olle 410     for (var i = 0; i < wells.length; i++)
3449 28 Jul 15 olle 411     {
3449 28 Jul 15 olle 412       var well = wells[i];
3449 28 Jul 15 olle 413       if (well.hasWarning())
3449 28 Jul 15 olle 414       {
3449 28 Jul 15 olle 415         numWarnings++;
3449 28 Jul 15 olle 416       }
3449 28 Jul 15 olle 417       if (well.hasError())
3449 28 Jul 15 olle 418       {
3449 28 Jul 15 olle 419         numErrors++;
3449 28 Jul 15 olle 420       }
3449 28 Jul 15 olle 421       else if (well.extract && well.extract.id)
3449 28 Jul 15 olle 422       {
3449 28 Jul 15 olle 423         numDna++;
3449 28 Jul 15 olle 424       }
3449 28 Jul 15 olle 425     }
3449 28 Jul 15 olle 426
3449 28 Jul 15 olle 427     if (numErrors > 0)
3449 28 Jul 15 olle 428     {
3449 28 Jul 15 olle 429       event.preventDefault();
3449 28 Jul 15 olle 430       return;
3449 28 Jul 15 olle 431     }
3449 28 Jul 15 olle 432     else if (numDna == 0)
3449 28 Jul 15 olle 433     {
3449 28 Jul 15 olle 434       alert('There is no DNA in any wells');
3449 28 Jul 15 olle 435       event.preventDefault();
3449 28 Jul 15 olle 436       return;
3449 28 Jul 15 olle 437     }
3449 28 Jul 15 olle 438     else if (numWarnings > 0)
3449 28 Jul 15 olle 439     {
3449 28 Jul 15 olle 440       if (!frm.verifyGoNext || !frm.verifyGoNext.checked)
3449 28 Jul 15 olle 441       {
3449 28 Jul 15 olle 442         Wizard.showGoNextConfirmation(true, 'There are ' + numWarnings + ' wells with a warning. Continue anyway?');
3449 28 Jul 15 olle 443         event.preventDefault();
3449 28 Jul 15 olle 444       }
3449 28 Jul 15 olle 445     }
3449 28 Jul 15 olle 446   }
3449 28 Jul 15 olle 447   
3449 28 Jul 15 olle 448   barcode.submit = function()
3449 28 Jul 15 olle 449   {
3449 28 Jul 15 olle 450     var frm = document.forms['meludi'];
3449 28 Jul 15 olle 451
3449 28 Jul 15 olle 452     var submitInfo = {};
3449 28 Jul 15 olle 453     var plateInfo = {};
3449 28 Jul 15 olle 454     
3449 28 Jul 15 olle 455     submitInfo.bioplate = plateInfo;
3449 28 Jul 15 olle 456     plateInfo.id = parseInt(frm.bioplate.value);
3449 28 Jul 15 olle 457     plateInfo.poolSchema = frm.pool_schema.value;
3449 28 Jul 15 olle 458     plateInfo.barcodeVariant = frm.barcode_variant.value;
3449 28 Jul 15 olle 459     plateInfo.comments = frm.comments.value;
3449 28 Jul 15 olle 460     plateInfo.wells = [];
3449 28 Jul 15 olle 461
3449 28 Jul 15 olle 462     var wells = Plate.getWells();
3449 28 Jul 15 olle 463     for (var i = 0; i < wells.length; i++)
3449 28 Jul 15 olle 464     {
3449 28 Jul 15 olle 465       var well = wells[i];
3449 28 Jul 15 olle 466       if (well.extract && well.extract.id)
3449 28 Jul 15 olle 467       {
3449 28 Jul 15 olle 468         var tmp = {};
3449 28 Jul 15 olle 469         tmp.row = well.row;
3449 28 Jul 15 olle 470         tmp.column = well.column;
3449 28 Jul 15 olle 471         tmp.dna = {};
3449 28 Jul 15 olle 472         tmp.dna.id = well.extract.id;
3449 28 Jul 15 olle 473 /*
3449 28 Jul 15 olle 474         tmp.dna.barcode = {};
3449 28 Jul 15 olle 475         tmp.dna.barcode.id = well.extract.barcode.id;
3449 28 Jul 15 olle 476 */
3449 28 Jul 15 olle 477         tmp.dna.barcode1 = {};
3449 28 Jul 15 olle 478         tmp.dna.barcode1.id = well.extract.barcode1.id;
3449 28 Jul 15 olle 479         tmp.dna.barcode2 = {};
3449 28 Jul 15 olle 480         tmp.dna.barcode2.id = well.extract.barcode2.id;
3449 28 Jul 15 olle 481         plateInfo.wells[plateInfo.wells.length] = tmp;
3449 28 Jul 15 olle 482       }
3449 28 Jul 15 olle 483     }
3449 28 Jul 15 olle 484
3449 28 Jul 15 olle 485     var url = '../LibPrep.servlet?ID='+App.getSessionId();
3449 28 Jul 15 olle 486     url += '&cmd=CreateBarcodedLibraries';
3449 28 Jul 15 olle 487     Wizard.showLoadingAnimation('Performing registration...');
3449 28 Jul 15 olle 488     Wizard.asyncJsonRequest(url, barcode.submissionResults, 'POST', JSON.stringify(submitInfo));
3449 28 Jul 15 olle 489   }
3449 28 Jul 15 olle 490   
3449 28 Jul 15 olle 491   barcode.submissionResults = function(response)
3449 28 Jul 15 olle 492   {
3449 28 Jul 15 olle 493     Wizard.showFinalMessage(response.messages);
3449 28 Jul 15 olle 494     Doc.show('gorestart');
3449 28 Jul 15 olle 495   }
3449 28 Jul 15 olle 496
3449 28 Jul 15 olle 497   return barcode;
3449 28 Jul 15 olle 498 }();
3449 28 Jul 15 olle 499
3449 28 Jul 15 olle 500 Doc.onLoad(Barcode.initPage);
3449 28 Jul 15 olle 501
3449 28 Jul 15 olle 502 var WellPainter = function()
3449 28 Jul 15 olle 503 {
3449 28 Jul 15 olle 504   var painter = {};
3449 28 Jul 15 olle 505   
3449 28 Jul 15 olle 506   painter.getClassNameForWell = function(well, schema)
3449 28 Jul 15 olle 507   {
3449 28 Jul 15 olle 508     var cls = '';
3449 28 Jul 15 olle 509     var indexSet = painter.barcodeVariant ? painter.barcodeVariant.indexSets[well.column] : null;
3449 28 Jul 15 olle 510     if (indexSet)
3449 28 Jul 15 olle 511     {
3449 28 Jul 15 olle 512       cls += indexSet.color;
3449 28 Jul 15 olle 513     }
3449 28 Jul 15 olle 514     var dna = well.extract;
3449 28 Jul 15 olle 515 /*
3449 28 Jul 15 olle 516     if (dna && dna.barcode)
3449 28 Jul 15 olle 517     {
3449 28 Jul 15 olle 518       if (dna.defaultBarcode && dna.barcode != dna.defaultBarcode)
3449 28 Jul 15 olle 519       {
3449 28 Jul 15 olle 520         cls += ' bg-modified';
3449 28 Jul 15 olle 521       }
3449 28 Jul 15 olle 522     }
3449 28 Jul 15 olle 523 */
3449 28 Jul 15 olle 524     if (dna && dna.barcode1)
3449 28 Jul 15 olle 525     {
3449 28 Jul 15 olle 526       if (dna.defaultBarcode1 && dna.barcode1 != dna.defaultBarcode1)
3449 28 Jul 15 olle 527       {
3449 28 Jul 15 olle 528         cls += ' bg-modified';
3449 28 Jul 15 olle 529       }
3449 28 Jul 15 olle 530     }
3449 28 Jul 15 olle 531     if (dna && dna.barcode2)
3449 28 Jul 15 olle 532     {
3449 28 Jul 15 olle 533       if (dna.defaultBarcode2 && dna.barcode2 != dna.defaultBarcode2)
3449 28 Jul 15 olle 534       {
3449 28 Jul 15 olle 535         cls += ' bg-modified';
3449 28 Jul 15 olle 536       }
3449 28 Jul 15 olle 537     }
3449 28 Jul 15 olle 538     if (well.duplicate)
3449 28 Jul 15 olle 539     {
3449 28 Jul 15 olle 540       cls += ' duplicate';
3449 28 Jul 15 olle 541     }
3449 28 Jul 15 olle 542     return cls;
3449 28 Jul 15 olle 543   }
3449 28 Jul 15 olle 544   
3449 28 Jul 15 olle 545   painter.getWellText = function(well, schema)
3449 28 Jul 15 olle 546   {
3449 28 Jul 15 olle 547     var text = '';
3449 28 Jul 15 olle 548     var dna = well.extract;
3449 28 Jul 15 olle 549     if (dna)
3449 28 Jul 15 olle 550     {
3449 28 Jul 15 olle 551       var name = dna.name;
3449 28 Jul 15 olle 552 /*
3449 28 Jul 15 olle 553       var i = name.indexOf('.m');
3449 28 Jul 15 olle 554       text += '<div class="name">'+name.substring(0, i)+'.<br>&nbsp;'+name.substring(i)+'</div>';
3449 28 Jul 15 olle 555 */
3449 28 Jul 15 olle 556       text += '<div class="name">'+name+'</div>';
3449 28 Jul 15 olle 557 /*
3449 28 Jul 15 olle 558       if (dna.barcode)
3449 28 Jul 15 olle 559       {
3449 28 Jul 15 olle 560         text += '<div class="barcode">'+dna.barcode.name+'</div>';
3449 28 Jul 15 olle 561         if (dna.defaultBarcode && dna.barcode != dna.defaultBarcode)
3449 28 Jul 15 olle 562         {
3449 28 Jul 15 olle 563           text += '<div class="warn-msg">Modified barcode</div>';
3449 28 Jul 15 olle 564         }
3449 28 Jul 15 olle 565       }
3449 28 Jul 15 olle 566       else
3449 28 Jul 15 olle 567       {
3449 28 Jul 15 olle 568         well.setError('No barcode');
3449 28 Jul 15 olle 569       }
3449 28 Jul 15 olle 570 */
3449 28 Jul 15 olle 571       if (dna.barcode2)
3449 28 Jul 15 olle 572       {
3449 28 Jul 15 olle 573         text += '<div class="barcode">'+dna.barcode2.name+'</div>';
3449 28 Jul 15 olle 574         if (dna.defaultBarcode2 && dna.barcode2 != dna.defaultBarcode2)
3449 28 Jul 15 olle 575         {
3449 28 Jul 15 olle 576           text += '<div class="warn-msg">Modified barcode 2</div>';
3449 28 Jul 15 olle 577         }
3449 28 Jul 15 olle 578       }
3449 28 Jul 15 olle 579       else
3449 28 Jul 15 olle 580       {
3449 28 Jul 15 olle 581         well.setError('No barcode 2');
3449 28 Jul 15 olle 582       }
3449 28 Jul 15 olle 583       if (dna.barcode1)
3449 28 Jul 15 olle 584       {
3449 28 Jul 15 olle 585         text += '<div class="barcode">'+dna.barcode1.name+'</div>';
3449 28 Jul 15 olle 586         if (dna.defaultBarcode1 && dna.barcode1 != dna.defaultBarcode1)
3449 28 Jul 15 olle 587         {
3449 28 Jul 15 olle 588           text += '<div class="warn-msg">Modified barcode 1</div>';
3449 28 Jul 15 olle 589         }
3449 28 Jul 15 olle 590       }
3449 28 Jul 15 olle 591       else
3449 28 Jul 15 olle 592       {
3449 28 Jul 15 olle 593         well.setError('No barcode 1');
3449 28 Jul 15 olle 594       }
3449 28 Jul 15 olle 595     }
3449 28 Jul 15 olle 596     if (well.duplicate)
3449 28 Jul 15 olle 597     {
3449 28 Jul 15 olle 598       well.setError('Duplicate barcode');
3449 28 Jul 15 olle 599     }
3449 28 Jul 15 olle 600     return text;
3449 28 Jul 15 olle 601   }
3449 28 Jul 15 olle 602
3449 28 Jul 15 olle 603   return painter;
3449 28 Jul 15 olle 604 }();
3449 28 Jul 15 olle 605
3449 28 Jul 15 olle 606