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

Code
Comments
Other
Rev Date Author Line
3656 09 Dec 15 olle 1 var InspectUsedKits = function()
3656 09 Dec 15 olle 2 {
3656 09 Dec 15 olle 3   var inspectusedkits = {};
3656 09 Dec 15 olle 4   
3656 09 Dec 15 olle 5   var debug = 0;
3656 09 Dec 15 olle 6   
3656 09 Dec 15 olle 7   var kitNum = 0;
3656 09 Dec 15 olle 8   var selectedKitName;
3656 09 Dec 15 olle 9   var plateNameIsValid = false;
3656 09 Dec 15 olle 10   var THIN_SPACE = ' ';
3656 09 Dec 15 olle 11
3656 09 Dec 15 olle 12   // Page initialization
3656 09 Dec 15 olle 13   inspectusedkits.initPage = function()
3656 09 Dec 15 olle 14   {
3656 09 Dec 15 olle 15     // Step 1
3656 09 Dec 15 olle 16     Events.addEventHandler('step-1', 'wizard-initialize', inspectusedkits.initializeStep1);
3656 09 Dec 15 olle 17     Events.addEventHandler('nofReservedFpaCells', 'change', inspectusedkits.numReservedCellsOnChange);
3656 09 Dec 15 olle 18     inspectusedkits.initializeStep1();
3656 09 Dec 15 olle 19   }
3656 09 Dec 15 olle 20
3656 09 Dec 15 olle 21   inspectusedkits.initializeStep1 = function()
3656 09 Dec 15 olle 22   {
3656 09 Dec 15 olle 23     var frm = document.forms['meludi'];
3656 09 Dec 15 olle 24     var numItems = frm.nofReservedFpaCells.value;
3656 09 Dec 15 olle 25
3656 09 Dec 15 olle 26     Wizard.setCurrentStep(1);
3656 09 Dec 15 olle 27     Doc.show('step-1');
3656 09 Dec 15 olle 28     // Disable kit tables until they have been loaded
3656 09 Dec 15 olle 29     Doc.hide('kitplatetablecontent');
3656 09 Dec 15 olle 30     // Hide lib prep kit menu, that is only used internally
3656 09 Dec 15 olle 31     Doc.hide('libPrepKit');
3656 09 Dec 15 olle 32
3656 09 Dec 15 olle 33     // Check what library preparation kits are available
3656 09 Dec 15 olle 34     var url = '../LibPrep.servlet?ID='+App.getSessionId();
3656 09 Dec 15 olle 35     url += '&cmd=GetLibPrepKitsAsPlates';
3656 09 Dec 15 olle 36     url += '&numItems=' + encodeURIComponent(numItems);
3656 09 Dec 15 olle 37     
3656 09 Dec 15 olle 38     Wizard.showLoadingAnimation('Loading information about kits...');
3656 09 Dec 15 olle 39     Wizard.asyncJsonRequest(url, inspectusedkits.kitPlatesInfoLoaded);
3656 09 Dec 15 olle 40   }
3656 09 Dec 15 olle 41
3656 09 Dec 15 olle 42   inspectusedkits.kitPlatesInfoLoaded = function(response)
3656 09 Dec 15 olle 43   {
3656 09 Dec 15 olle 44     var frm = document.forms['meludi'];  
3656 09 Dec 15 olle 45     var nofReservedFpaCells = frm.nofReservedFpaCells.value;
3656 09 Dec 15 olle 46     var platesInfo = response.plates;
3656 09 Dec 15 olle 47     if (platesInfo)
3656 09 Dec 15 olle 48     {
3656 09 Dec 15 olle 49       // Find header data
3656 09 Dec 15 olle 50       //var numItems = names.length;
3656 09 Dec 15 olle 51       var numItems = nofReservedFpaCells;
3656 09 Dec 15 olle 52       var numUsedActiveKits = 0;
3656 09 Dec 15 olle 53       var numUnusedActiveKits = 0;
3656 09 Dec 15 olle 54       var usedActiveKitsJsonArr = [];
3656 09 Dec 15 olle 55       var unusedActiveKitsJsonArr = [];
3656 09 Dec 15 olle 56       var activeKitsJsonArr = [];
3656 09 Dec 15 olle 57       for (var i = 0; i < platesInfo.length; i++)
3656 09 Dec 15 olle 58       {
3656 09 Dec 15 olle 59         var plateInfo = platesInfo[i];
3656 09 Dec 15 olle 60         var bioplate = plateInfo;
3656 09 Dec 15 olle 61         var expirationDate = bioplate.expirationDate;
3656 09 Dec 15 olle 62         var numTimesUsed = bioplate.timesUsed;
3656 09 Dec 15 olle 63         var unusedWellsJsonArr = bioplate.unusedWells;
3656 09 Dec 15 olle 64         var effUnusedWellsJsonArr = bioplate.effUnusedWells;
3656 09 Dec 15 olle 65         var reservedWellsJsonArr = bioplate.reservedWells;
3656 09 Dec 15 olle 66         var numUnusedWells = unusedWellsJsonArr.length;
3656 09 Dec 15 olle 67         var jsonKit = {};
3656 09 Dec 15 olle 68         jsonKit['id'] = bioplate.kitId;
3656 09 Dec 15 olle 69         jsonKit['name'] = bioplate.kitName;
3656 09 Dec 15 olle 70         jsonKit['expirationDate'] = expirationDate;
3656 09 Dec 15 olle 71         jsonKit['numTimesUsed'] = numTimesUsed;
3656 09 Dec 15 olle 72         jsonKit['unusedWells'] = unusedWellsJsonArr;
3656 09 Dec 15 olle 73         jsonKit['effUnusedWells'] = effUnusedWellsJsonArr;
3656 09 Dec 15 olle 74         jsonKit['reservedWells'] = reservedWellsJsonArr;
3656 09 Dec 15 olle 75         jsonKit['numUnusedWells'] = numUnusedWells;
3656 09 Dec 15 olle 76         if (numUnusedWells < 48)
3656 09 Dec 15 olle 77         {
3656 09 Dec 15 olle 78           numUsedActiveKits++;
3656 09 Dec 15 olle 79           usedActiveKitsJsonArr[usedActiveKitsJsonArr.length] = jsonKit;
3656 09 Dec 15 olle 80         }
3656 09 Dec 15 olle 81         else
3656 09 Dec 15 olle 82         {
3656 09 Dec 15 olle 83           numUnusedActiveKits++;
3656 09 Dec 15 olle 84           unusedActiveKitsJsonArr[unusedActiveKitsJsonArr.length] = jsonKit;
3656 09 Dec 15 olle 85         }
3656 09 Dec 15 olle 86       }
3656 09 Dec 15 olle 87       // List used kits first
3656 09 Dec 15 olle 88       for (var i=0; i < usedActiveKitsJsonArr.length; i++)
3656 09 Dec 15 olle 89       {
3656 09 Dec 15 olle 90         activeKitsJsonArr[activeKitsJsonArr.length] = usedActiveKitsJsonArr[i];
3656 09 Dec 15 olle 91       }
3656 09 Dec 15 olle 92       // List unused kits after
3656 09 Dec 15 olle 93       for (var i=0; i < unusedActiveKitsJsonArr.length; i++)
3656 09 Dec 15 olle 94       {
3656 09 Dec 15 olle 95         activeKitsJsonArr[activeKitsJsonArr.length] = unusedActiveKitsJsonArr[i];
3656 09 Dec 15 olle 96       }
3656 09 Dec 15 olle 97
3656 09 Dec 15 olle 98       // Form header
3656 09 Dec 15 olle 99       var html = '';
3656 09 Dec 15 olle 100       html += '<b>Number of DNA items: ' + numItems + '</b><br>';
3656 09 Dec 15 olle 101 /*
3656 09 Dec 15 olle 102       html += '<b>Unused and active kits (' + numUnusedActiveKits + ')</b><br>';
3656 09 Dec 15 olle 103       html += '<b>Used and active kits (' + numUsedActiveKits + '):</b><br>';
3656 09 Dec 15 olle 104 */
3656 09 Dec 15 olle 105       html += '<br>';
3656 09 Dec 15 olle 106       html += 'Gray wells: Used<br>';
3656 09 Dec 15 olle 107       html += 'Dark green wells: Unused but ignored due to placement rules<br>';
3656 09 Dec 15 olle 108       html += 'Light green wells: Unused<br>';
3656 09 Dec 15 olle 109       html += 'Yellow wells: Unused and reserved for selected FPA aliquots<br>';
3656 09 Dec 15 olle 110       html += '<br>';
3656 09 Dec 15 olle 111
3656 09 Dec 15 olle 112       // Display data for used and active kits
3656 09 Dec 15 olle 113       var defaultKitSelected = false;
3656 09 Dec 15 olle 114       var checkedStr = "";
3656 09 Dec 15 olle 115       kitNum = 0;
3656 09 Dec 15 olle 116       // Used and active kits
3656 09 Dec 15 olle 117       html += '<td class="prompt"><b>Used and active kits (' + numUsedActiveKits + '):</b></td>';
3656 09 Dec 15 olle 118       html += '<br>';
3656 09 Dec 15 olle 119       html += '<br>';
3656 09 Dec 15 olle 120       for (var i = 0; i < platesInfo.length; i++)
3656 09 Dec 15 olle 121       {
3656 09 Dec 15 olle 122         var plateInfo = platesInfo[i];
3656 09 Dec 15 olle 123         var bioplate = plateInfo;
3656 09 Dec 15 olle 124         var unusedWellsJsonArr = bioplate.unusedWells;
3656 09 Dec 15 olle 125         var numUnusedWells = unusedWellsJsonArr.length;
3656 09 Dec 15 olle 126         if (numUnusedWells < 48)
3656 09 Dec 15 olle 127         {
3656 09 Dec 15 olle 128           // Display half plate chart of unused wells for FPA aliquots
3656 09 Dec 15 olle 129           var kitName = bioplate.kitName;
3656 09 Dec 15 olle 130           var expirationDate = bioplate.expirationDate;
3656 09 Dec 15 olle 131           var timesUsed = bioplate.timesUsed;
3656 09 Dec 15 olle 132           var checkedStr = "";
3656 09 Dec 15 olle 133           if (!defaultKitSelected)
3656 09 Dec 15 olle 134           {
3656 09 Dec 15 olle 135             selectedKitName = kitName;
3656 09 Dec 15 olle 136             defaultKitSelected = true;
3656 09 Dec 15 olle 137             checkedStr = " checked";
3656 09 Dec 15 olle 138           }
3656 09 Dec 15 olle 139 /*
3656 09 Dec 15 olle 140           html += '<td style="width: 3em;"><input type="radio" name="uselibprepkit.'+kitNum+'" id="uselibprepkit.'+kitNum+'" value="'+kitName+'"'+checkedStr+'><b>Kit: ' + kitName + '</b> [Exp. ' + Strings.encodeTags(expirationDate) + '] #Times used: ' + timesUsed + '</td><br>';
3656 09 Dec 15 olle 141 */
3656 09 Dec 15 olle 142           html += '<td style="width: 3em;"><b>' + (kitNum + 1) + '. Kit: ' + kitName + '</b> [Exp. ' + Strings.encodeTags(expirationDate) + '] #Times used: ' + timesUsed + '</td><br>';
3656 09 Dec 15 olle 143           html += inspectusedkits.buildKitInfoPlate(bioplate);
3656 09 Dec 15 olle 144           html += '<br>';
3656 09 Dec 15 olle 145           kitNum++;
3656 09 Dec 15 olle 146         }
3656 09 Dec 15 olle 147       }
3656 09 Dec 15 olle 148       // Unused kits
3656 09 Dec 15 olle 149       html += '<td class="prompt"><b>Unused kits (' + unusedActiveKitsJsonArr.length + '):</b></td>';
3656 09 Dec 15 olle 150       html += '<br>';
3656 09 Dec 15 olle 151       for (var i=0; i < unusedActiveKitsJsonArr.length; i++)
3656 09 Dec 15 olle 152       {
3656 09 Dec 15 olle 153         var jsonKit = unusedActiveKitsJsonArr[i];
3656 09 Dec 15 olle 154         var kitName = jsonKit['name'];
3656 09 Dec 15 olle 155         var expirationDate = jsonKit['expirationDate'];
3656 09 Dec 15 olle 156         var checkedStr = "";
3656 09 Dec 15 olle 157         if (!defaultKitSelected)
3656 09 Dec 15 olle 158         {
3656 09 Dec 15 olle 159           selectedKitName = kitName;
3656 09 Dec 15 olle 160           defaultKitSelected = true;
3656 09 Dec 15 olle 161           checkedStr = " checked";
3656 09 Dec 15 olle 162         }
3656 09 Dec 15 olle 163         html += '<br>';
3656 09 Dec 15 olle 164 /*
3656 09 Dec 15 olle 165         html += '<td style="width: 3em;"><input type="radio" name="uselibprepkit.'+kitNum+'" id="uselibprepkit.'+kitNum+'" value="'+kitName+'"'+checkedStr+'><b>Kit: ' + kitName + '</b> [Exp. ' + Strings.encodeTags(expirationDate) + ']</td>';
3656 09 Dec 15 olle 166 */
3656 09 Dec 15 olle 167         html += '<td style="width: 3em;"><b>' + (kitNum + 1) + '. Kit: ' + kitName + '</b> [Exp. ' + Strings.encodeTags(expirationDate) + ']</td>';
3656 09 Dec 15 olle 168         kitNum++;
3656 09 Dec 15 olle 169       }
3656 09 Dec 15 olle 170       html += '<br>';
3656 09 Dec 15 olle 171       if (activeKitsJsonArr.length == 0)
3656 09 Dec 15 olle 172       {
3656 09 Dec 15 olle 173         Wizard.setFatalError('No library preparation kits available.');
3656 09 Dec 15 olle 174         return;
3656 09 Dec 15 olle 175       }
3656 09 Dec 15 olle 176       Doc.element('kitplatetablecontent').innerHTML = html;
3656 09 Dec 15 olle 177       Doc.show('kitplatetablecontent');
3656 09 Dec 15 olle 178
3656 09 Dec 15 olle 179 /*
3656 09 Dec 15 olle 180       for (var i=0; i < kitNum; i++)
3656 09 Dec 15 olle 181       {
3656 09 Dec 15 olle 182         // Add event handler for radio buttons
3656 09 Dec 15 olle 183         Events.addEventHandler('uselibprepkit.'+i, 'change', inspectusedkits.kitOnChange, { 'index': i });
3656 09 Dec 15 olle 184       }
3656 09 Dec 15 olle 185
3656 09 Dec 15 olle 186       // Library preparation kit selection menu (hidden, but used internally)
3656 09 Dec 15 olle 187       var libPrepKitList = frm.libPrepKit;
3656 09 Dec 15 olle 188       if (activeKitsJsonArr.length > 0)
3656 09 Dec 15 olle 189       {
3656 09 Dec 15 olle 190         for (var i=0; i < activeKitsJsonArr.length; i++)
3656 09 Dec 15 olle 191         {
3656 09 Dec 15 olle 192           var jsonKit = activeKitsJsonArr[i];
3656 09 Dec 15 olle 193           var kitName = jsonKit['name'];
3656 09 Dec 15 olle 194           var expirationDate = jsonKit['expirationDate'];
3656 09 Dec 15 olle 195           var numTimesUsed = jsonKit['numTimesUsed'];
3656 09 Dec 15 olle 196           var numUnusedWells = jsonKit['numUnusedWells'];
3656 09 Dec 15 olle 197           //
3656 09 Dec 15 olle 198           var name = Strings.encodeTags(kitName);
3656 09 Dec 15 olle 199           if (numUnusedWells != null && numTimesUsed != null)
3656 09 Dec 15 olle 200           {
3656 09 Dec 15 olle 201             name += ' -- (';
3656 09 Dec 15 olle 202             name += '#Unused wells: ' + numUnusedWells;
3656 09 Dec 15 olle 203             name += ' #Times used: ' + numTimesUsed;
3656 09 Dec 15 olle 204             name += ')';
3656 09 Dec 15 olle 205           }
3656 09 Dec 15 olle 206           if (expirationDate)
3656 09 Dec 15 olle 207           {
3656 09 Dec 15 olle 208             name += ' [Exp. ' + Strings.encodeTags(expirationDate) + ']';
3656 09 Dec 15 olle 209           }
3656 09 Dec 15 olle 210           var selected = (i == 0);
3656 09 Dec 15 olle 211           var option = new Option(name, kitName, selected, selected);
3656 09 Dec 15 olle 212           option.jsonKit = jsonKit;
3656 09 Dec 15 olle 213           libPrepKitList.options[libPrepKitList.length] = option;
3656 09 Dec 15 olle 214         }
3656 09 Dec 15 olle 215         libPrepKitList.options[0].selected = true;
3656 09 Dec 15 olle 216       }
3656 09 Dec 15 olle 217       else
3656 09 Dec 15 olle 218       {
3656 09 Dec 15 olle 219         Wizard.setFatalError('No library preparation kits available.');
3656 09 Dec 15 olle 220         return;
3656 09 Dec 15 olle 221       }
3656 09 Dec 15 olle 222 */
3656 09 Dec 15 olle 223     }
3656 09 Dec 15 olle 224     Doc.removeClass('gonext', 'disabled');
3656 09 Dec 15 olle 225   }
3656 09 Dec 15 olle 226
3656 09 Dec 15 olle 227   inspectusedkits.kitOnChange = function(event)
3656 09 Dec 15 olle 228   {
3656 09 Dec 15 olle 229     var frm = document.forms['meludi'];
3656 09 Dec 15 olle 230     var target = event.currentTarget;
3656 09 Dec 15 olle 231
3656 09 Dec 15 olle 232     var index = Data.int(target, 'index');
3656 09 Dec 15 olle 233
3656 09 Dec 15 olle 234     extraMaterialIsValid = true;
3656 09 Dec 15 olle 235
3656 09 Dec 15 olle 236     selectedKitName = frm['uselibprepkit.'+index].value;
3656 09 Dec 15 olle 237
3656 09 Dec 15 olle 238     // Reset all other radio buttons
3656 09 Dec 15 olle 239     for (var i=0; i < kitNum; i++)
3656 09 Dec 15 olle 240     {
3656 09 Dec 15 olle 241       if (i != index)
3656 09 Dec 15 olle 242       {
3656 09 Dec 15 olle 243         Doc.element('uselibprepkit.'+i).checked = false;
3656 09 Dec 15 olle 244       }
3656 09 Dec 15 olle 245     }
3656 09 Dec 15 olle 246   }
3656 09 Dec 15 olle 247
3656 09 Dec 15 olle 248   inspectusedkits.numReservedCellsOnChange = function(event)
3656 09 Dec 15 olle 249   {
3656 09 Dec 15 olle 250     inspectusedkits.initializeStep1();
3656 09 Dec 15 olle 251   }
3656 09 Dec 15 olle 252
3656 09 Dec 15 olle 253   inspectusedkits.plateNameOnChange = function(event)
3656 09 Dec 15 olle 254   {
3656 09 Dec 15 olle 255     var frm = document.forms['meludi'];
3656 09 Dec 15 olle 256     plateNameIsValid = false;
3656 09 Dec 15 olle 257     
3656 09 Dec 15 olle 258     var name = frm.plateName.value;
3656 09 Dec 15 olle 259     if (!name || name == '')
3656 09 Dec 15 olle 260     {
3656 09 Dec 15 olle 261       Wizard.setInputStatus('plateName', 'invalid', 'Missing name');
3656 09 Dec 15 olle 262       return;
3656 09 Dec 15 olle 263     }
3656 09 Dec 15 olle 264     if (name.indexOf("LP") != 0)
3656 09 Dec 15 olle 265     {
3656 09 Dec 15 olle 266       Wizard.setInputStatus('plateName', 'invalid', 'Plate name must start with prefix "LP"');
3656 09 Dec 15 olle 267       return;
3656 09 Dec 15 olle 268     }
3656 09 Dec 15 olle 269     if (name.length != 7)
3656 09 Dec 15 olle 270     {
3656 09 Dec 15 olle 271       Wizard.setInputStatus('plateName', 'invalid', 'Plate name must consist of "LP" + 5 digits');
3656 09 Dec 15 olle 272       return;
3656 09 Dec 15 olle 273     }
3656 09 Dec 15 olle 274     
3656 09 Dec 15 olle 275     // Check if name exists
3656 09 Dec 15 olle 276     var url = '../Extraction.servlet?ID='+App.getSessionId();
3656 09 Dec 15 olle 277     url += '&cmd=CheckIfStartPlateNameUsed';
3656 09 Dec 15 olle 278     url += '&startPlateName=' + encodeURIComponent(name);
3656 09 Dec 15 olle 279     
3656 09 Dec 15 olle 280     Wizard.showLoadingAnimation('Loading information about plate...');
3656 09 Dec 15 olle 281     Wizard.asyncJsonRequest(url, inspectusedkits.plateInfoLoaded);
3656 09 Dec 15 olle 282   }
3656 09 Dec 15 olle 283
3656 09 Dec 15 olle 284   inspectusedkits.plateInfoLoaded = function(response)
3656 09 Dec 15 olle 285   {
3656 09 Dec 15 olle 286     var frm = document.forms['meludi'];  
3656 09 Dec 15 olle 287     var plateInfo = response.startplate;
3656 09 Dec 15 olle 288     if (plateInfo)
3656 09 Dec 15 olle 289     {
3656 09 Dec 15 olle 290       var plateName = plateInfo.name;
3656 09 Dec 15 olle 291       var plateId = plateInfo.id;
3656 09 Dec 15 olle 292
3656 09 Dec 15 olle 293       if (plateId)
3656 09 Dec 15 olle 294       {
3656 09 Dec 15 olle 295         plateNameIsValid = false;
3656 09 Dec 15 olle 296         Wizard.setInputStatus('plateName', 'invalid', 'Plate already exists with name "' + plateName + '" (ID = ' + plateId + ')');
3656 09 Dec 15 olle 297         return;
3656 09 Dec 15 olle 298       }
3656 09 Dec 15 olle 299     }
3656 09 Dec 15 olle 300     plateNameIsValid = true;
3656 09 Dec 15 olle 301     Plate.name = name;
3656 09 Dec 15 olle 302     
3656 09 Dec 15 olle 303     Wizard.setInputStatus('plateName', 'valid');
3656 09 Dec 15 olle 304   }
3656 09 Dec 15 olle 305   
3656 09 Dec 15 olle 306   inspectusedkits.buildKitInfoPlate = function(plate)
3656 09 Dec 15 olle 307   {
3656 09 Dec 15 olle 308     var html = '';
3656 09 Dec 15 olle 309     // Table row with kit data
3656 09 Dec 15 olle 310     html += '<tr class="align-top">';
3656 09 Dec 15 olle 311     // Added data for kit
3656 09 Dec 15 olle 312     var kitName = plate.kitName;
3656 09 Dec 15 olle 313     var expirationDate = plate.expirationDate;
3656 09 Dec 15 olle 314     var timesUsed = plate.timesUsed;
3656 09 Dec 15 olle 315     //
3656 09 Dec 15 olle 316     var unusedWellsJsonArr = plate.unusedWells;
3656 09 Dec 15 olle 317     var effUnusedWellsJsonArr = plate.effUnusedWells;
3656 09 Dec 15 olle 318     var reservedWellsJsonArr = plate.reservedWells;
3656 09 Dec 15 olle 319
3656 09 Dec 15 olle 320 /*    
3656 09 Dec 15 olle 321     html += '<td class="prompt"><b>Kit name: ' + kitName + '</b></td><br>';
3656 09 Dec 15 olle 322     html += '<td class="prompt"><b>Expiration date: ' + expirationDate + '</b></td><br>';
3656 09 Dec 15 olle 323     html += '<td class="prompt"><b>#Times used: ' + timesUsed + '</b></td><br>';
3656 09 Dec 15 olle 324     html += '<td class="prompt"><b>#Available wells: ' + unusedWellsJsonArr.length + '</b></td><br>';
3656 09 Dec 15 olle 325     html += '<td class="prompt"><b>#Eff. available wells: ' + effUnusedWellsJsonArr.length + '</b></td><br>';
3656 09 Dec 15 olle 326 */
3656 09 Dec 15 olle 327     // Kit as plate
3656 09 Dec 15 olle 328     // Only show FPA columns, i.e. columns 0-5
3656 09 Dec 15 olle 329     var colNoEnd = 5;
3656 09 Dec 15 olle 330     if (plate.geometry.columns < colNoEnd)
3656 09 Dec 15 olle 331     {
3656 09 Dec 15 olle 332       colNoEnd = plate.geometry.columns;
3656 09 Dec 15 olle 333     }
3656 09 Dec 15 olle 334     html += '<td>';
3656 09 Dec 15 olle 335     html += '<table class="plate">';
3656 09 Dec 15 olle 336     html += '<tr class="header"><th></th>';
3656 09 Dec 15 olle 337     for (var colNo = 0; colNo <= colNoEnd; colNo++)
3656 09 Dec 15 olle 338     {
3656 09 Dec 15 olle 339       html += '<th>'+(colNo+1)+'</th>';
3656 09 Dec 15 olle 340     }
3656 09 Dec 15 olle 341     html += '</tr>';
3656 09 Dec 15 olle 342     var wells = plate.bioWells;
3656 09 Dec 15 olle 343     var wellNo = 0;
3656 09 Dec 15 olle 344     for (var rowNo = 0; rowNo < plate.geometry.rows; rowNo++)
3656 09 Dec 15 olle 345     {
3656 09 Dec 15 olle 346       html += '<tr class="row-'+rowNo+'">';
3656 09 Dec 15 olle 347       html += '<th>'+Meludi.wellToAlpha(rowNo)+'</th>';
3656 09 Dec 15 olle 348       for (var colNo = 0; colNo <= colNoEnd; colNo++)
3656 09 Dec 15 olle 349       {
3656 09 Dec 15 olle 350         var well = wells[wellNo];
3656 09 Dec 15 olle 351         well.extraVolume = 0;
3656 09 Dec 15 olle 352         well.comment = '';
3656 09 Dec 15 olle 353         
3656 09 Dec 15 olle 354         if (well.bioMaterial)
3656 09 Dec 15 olle 355         {
3656 09 Dec 15 olle 356           html += '<td id="well-'+well.id+'"';
3656 09 Dec 15 olle 357           html += ' class="well selectable col-'+colNo+'"';
3656 09 Dec 15 olle 358           html += ' title="'+Strings.encodeTags(well.bioMaterial.name)+'" data-well-id="'+well.id+'"';
3656 09 Dec 15 olle 359           html += '>0'+THIN_SPACE+'µl</td>';
3656 09 Dec 15 olle 360         }
3656 09 Dec 15 olle 361         else
3656 09 Dec 15 olle 362         {
3656 09 Dec 15 olle 363           var wellName = Meludi.wellToAlpha(rowNo) + (colNo+1);
3656 09 Dec 15 olle 364           // Check if kit is used for current well
3656 09 Dec 15 olle 365           var usedWell = true;
3656 09 Dec 15 olle 366           for (var i = 0; i < unusedWellsJsonArr.length; i++)
3656 09 Dec 15 olle 367           {
3656 09 Dec 15 olle 368             var nameOfUnusedWell = unusedWellsJsonArr[i];
3656 09 Dec 15 olle 369             if (wellName == nameOfUnusedWell)
3656 09 Dec 15 olle 370             {
3656 09 Dec 15 olle 371               usedWell = false;
3656 09 Dec 15 olle 372             }
3656 09 Dec 15 olle 373           }
3656 09 Dec 15 olle 374           var effUsedWell = true;
3656 09 Dec 15 olle 375           for (var i = 0; i < effUnusedWellsJsonArr.length; i++)
3656 09 Dec 15 olle 376           {
3656 09 Dec 15 olle 377             var nameOfUnusedWell = effUnusedWellsJsonArr[i];
3656 09 Dec 15 olle 378             if (wellName == nameOfUnusedWell)
3656 09 Dec 15 olle 379             {
3656 09 Dec 15 olle 380               effUsedWell = false;
3656 09 Dec 15 olle 381             }
3656 09 Dec 15 olle 382           }
3656 09 Dec 15 olle 383           var reservedWell = false;
3656 09 Dec 15 olle 384           for (var i = 0; i < reservedWellsJsonArr.length; i++)
3656 09 Dec 15 olle 385           {
3656 09 Dec 15 olle 386             var nameOfReservedWell = reservedWellsJsonArr[i];
3656 09 Dec 15 olle 387             if (wellName == nameOfReservedWell)
3656 09 Dec 15 olle 388             {
3656 09 Dec 15 olle 389               reservedWell = true;
3656 09 Dec 15 olle 390             }
3656 09 Dec 15 olle 391           }
3656 09 Dec 15 olle 392           if (usedWell)
3656 09 Dec 15 olle 393           {
3656 09 Dec 15 olle 394             // Empty well
3656 09 Dec 15 olle 395             html += '<td class="kitwell empty col-'+colNo+'">';
3656 09 Dec 15 olle 396           }
3656 09 Dec 15 olle 397           else
3656 09 Dec 15 olle 398           {
3656 09 Dec 15 olle 399             // Unused well
3656 09 Dec 15 olle 400             //html += '<td class="kitwell unused col-'+colNo+'">';
3656 09 Dec 15 olle 401             var new_html = '';
3656 09 Dec 15 olle 402             if (effUsedWell)
3656 09 Dec 15 olle 403             {
3656 09 Dec 15 olle 404               new_html = '<td class="kitwell unused col-'+colNo+'">';
3656 09 Dec 15 olle 405             }
3656 09 Dec 15 olle 406             else
3656 09 Dec 15 olle 407             {
3656 09 Dec 15 olle 408               new_html = '<td class="kitwell effunused col-'+colNo+'">';
3656 09 Dec 15 olle 409               if (reservedWell)
3656 09 Dec 15 olle 410               {
3656 09 Dec 15 olle 411                 new_html = '<td class="kitwell reserved col-'+colNo+'">';
3656 09 Dec 15 olle 412               }
3656 09 Dec 15 olle 413             }
3656 09 Dec 15 olle 414             html += new_html;
3656 09 Dec 15 olle 415           }
3656 09 Dec 15 olle 416           html += '<div class="name">' + wellName + '</div>';
3656 09 Dec 15 olle 417           html += '</td>';
3656 09 Dec 15 olle 418         }
3656 09 Dec 15 olle 419         wellNo++;
3656 09 Dec 15 olle 420       }
3656 09 Dec 15 olle 421       html += '</tr>';
3656 09 Dec 15 olle 422     }
3656 09 Dec 15 olle 423     html += '</table>';
3656 09 Dec 15 olle 424     html += '</td>';
3656 09 Dec 15 olle 425     // Kit status
3656 09 Dec 15 olle 426     html += '<td class="status" id="libPrepKitAsPlate.status"></td>';
3656 09 Dec 15 olle 427     // Kit message
3656 09 Dec 15 olle 428     //var kitMessage = 'Highlighted wells are unused.';
3656 09 Dec 15 olle 429     var kitMessage = '';
3656 09 Dec 15 olle 430     html += '<td class="help">';
3656 09 Dec 15 olle 431     html += '<span id="libPrepKitAsPlate.message" class="message" ></span>';
3656 09 Dec 15 olle 432     html += kitMessage;
3656 09 Dec 15 olle 433     html += '</td>';
3656 09 Dec 15 olle 434     // End of table row with kit data
3656 09 Dec 15 olle 435     html += '</tr>';
3656 09 Dec 15 olle 436
3656 09 Dec 15 olle 437     return html;
3656 09 Dec 15 olle 438   }
3656 09 Dec 15 olle 439
3656 09 Dec 15 olle 440   return inspectusedkits;
3656 09 Dec 15 olle 441 }();
3656 09 Dec 15 olle 442
3656 09 Dec 15 olle 443 Doc.onLoad(InspectUsedKits.initPage);
3656 09 Dec 15 olle 444 Doc.addElementInitializer(InspectUsedKits.initElements);