extensions/net.sf.basedb.reggie/trunk/resources/sampleproc/histology_glass.js

Code
Comments
Other
Rev Date Author Line
2794 13 Oct 14 nicklas 1 var Histology = function()
2794 13 Oct 14 nicklas 2 {
2794 13 Oct 14 nicklas 3   var histology = {};
2853 23 Oct 14 nicklas 4   var debug = 0;
2794 13 Oct 14 nicklas 5
2794 13 Oct 14 nicklas 6   var paraffinBlock;
2794 13 Oct 14 nicklas 7   var wells = ['idx.0.0', 'idx.1.0', 'idx.1.1', 'idx.2.0', 'idx.2.1'];
2794 13 Oct 14 nicklas 8   var wellIsValid = [];
6646 17 Mar 22 nicklas 9   var usedWells = [];
2794 13 Oct 14 nicklas 10   var numHEGlassIsValid = true;
3119 06 Feb 15 nicklas 11   var existingNumberOfHEGlass = 0;
2794 13 Oct 14 nicklas 12   var glassBoxIsValid = [];
2794 13 Oct 14 nicklas 13   
2794 13 Oct 14 nicklas 14   // Page initialization
2794 13 Oct 14 nicklas 15   histology.initPage = function()
2794 13 Oct 14 nicklas 16   {
2794 13 Oct 14 nicklas 17     // Step 1
2794 13 Oct 14 nicklas 18     Events.addEventHandler('step-1', 'wizard-validate', histology.validateStep1);
2794 13 Oct 14 nicklas 19     Buttons.addClickHandler('btnSelectParaffinBlock', histology.selectParaffinBlock);
2794 13 Oct 14 nicklas 20     Events.addEventHandler('plates', 'base-selected', histology.onParaffinBlockSelected);
2794 13 Oct 14 nicklas 21     
2794 13 Oct 14 nicklas 22     // Step 2
2794 13 Oct 14 nicklas 23     Events.addEventHandler('step-2', 'wizard-initialize', histology.initializeStep2);
2794 13 Oct 14 nicklas 24     Events.addEventHandler('step-2', 'wizard-validate', histology.validateStep2);
2794 13 Oct 14 nicklas 25     Events.addEventHandler('stainDate', 'blur', Wizard.validateDate);
2794 13 Oct 14 nicklas 26     Events.addEventHandler('numberOfHEGlass', 'keypress', Events.integerOnly);
2794 13 Oct 14 nicklas 27     Events.addEventHandler('numberOfHEGlass', 'change', histology.checkNumHEGlass);
2794 13 Oct 14 nicklas 28     
2794 13 Oct 14 nicklas 29     for (var i = 0; i < wells.length; i++)
2794 13 Oct 14 nicklas 30     {
2794 13 Oct 14 nicklas 31       var w = wells[i];
2794 13 Oct 14 nicklas 32       wellIsValid[w] = false;
2794 13 Oct 14 nicklas 33       Events.addEventHandler(w, 'keypress', Events.integerOnly);
2794 13 Oct 14 nicklas 34       Events.addEventHandler(w, 'blur', histology.checkIndexValue);
2794 13 Oct 14 nicklas 35     }
2794 13 Oct 14 nicklas 36     
2794 13 Oct 14 nicklas 37     // Step 3
2794 13 Oct 14 nicklas 38     Events.addEventHandler('step-3', 'wizard-initialize', histology.initializeStep3);
2794 13 Oct 14 nicklas 39     Events.addEventHandler('step-3', 'wizard-validate', histology.validateStep3);
2794 13 Oct 14 nicklas 40     
2794 13 Oct 14 nicklas 41     // Navigation
2794 13 Oct 14 nicklas 42     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
2794 13 Oct 14 nicklas 43     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2794 13 Oct 14 nicklas 44     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2794 13 Oct 14 nicklas 45     Buttons.addClickHandler('goregister', Wizard.goRegister);
2794 13 Oct 14 nicklas 46
2794 13 Oct 14 nicklas 47     // Final registration
2794 13 Oct 14 nicklas 48     Events.addEventHandler('wizard', 'wizard-submit', histology.submit);
2794 13 Oct 14 nicklas 49     
2794 13 Oct 14 nicklas 50     var url = '../Histology.servlet?ID='+App.getSessionId();
2794 13 Oct 14 nicklas 51     url += '&cmd=GetParaffinBlocks';
2794 13 Oct 14 nicklas 52     Wizard.showLoadingAnimation('Loading paraffin blocks...');
2794 13 Oct 14 nicklas 53     Wizard.asyncJsonRequest(url, histology.paraffinBlocksLoaded);
2794 13 Oct 14 nicklas 54   }
2794 13 Oct 14 nicklas 55   
2794 13 Oct 14 nicklas 56   histology.paraffinBlocksLoaded = function(response)
2794 13 Oct 14 nicklas 57   {
2794 13 Oct 14 nicklas 58     var frm = document.forms['reggie'];
2794 13 Oct 14 nicklas 59
2794 13 Oct 14 nicklas 60     var plates = response.plates;
2794 13 Oct 14 nicklas 61     
2794 13 Oct 14 nicklas 62     var plateList = frm.plates;
2794 13 Oct 14 nicklas 63     if (plates.length > 0)
2794 13 Oct 14 nicklas 64     {
2794 13 Oct 14 nicklas 65       for (var i=0; i < plates.length; i++)
2794 13 Oct 14 nicklas 66       {
2794 13 Oct 14 nicklas 67         var plate = plates[i];
2794 13 Oct 14 nicklas 68         var option = new Option(plate.name, plate.id);
2794 13 Oct 14 nicklas 69         option.plate = plate;
2794 13 Oct 14 nicklas 70         plateList.options[plateList.length] = option;
2794 13 Oct 14 nicklas 71       }
2794 13 Oct 14 nicklas 72     }
2794 13 Oct 14 nicklas 73     else
2794 13 Oct 14 nicklas 74     {  
2794 13 Oct 14 nicklas 75       Wizard.setInputStatus('plates', 'invalid', 'No paraffin blocks could be found.');
2794 13 Oct 14 nicklas 76     }
2794 13 Oct 14 nicklas 77
2794 13 Oct 14 nicklas 78     Doc.show('gonext');
2794 13 Oct 14 nicklas 79     Doc.show('step-1');
2794 13 Oct 14 nicklas 80   }
2794 13 Oct 14 nicklas 81
2794 13 Oct 14 nicklas 82
2794 13 Oct 14 nicklas 83   histology.selectParaffinBlock = function()
2794 13 Oct 14 nicklas 84   {
2794 13 Oct 14 nicklas 85     var frm = document.forms['reggie'];
2794 13 Oct 14 nicklas 86     if (frm.plates.disabled) return;
2794 13 Oct 14 nicklas 87
2794 13 Oct 14 nicklas 88     var url = '&resetTemporary=1';
2794 13 Oct 14 nicklas 89     url += '&tmpfilter:STRING:bioPlateType.name=FFPE+block';
2794 13 Oct 14 nicklas 90     url += '&tmpfilter:INT:freeWells=1';
2794 13 Oct 14 nicklas 91     Dialogs.selectItem('BIOPLATE', 'plates', 1, url);
2794 13 Oct 14 nicklas 92   }
2794 13 Oct 14 nicklas 93
2794 13 Oct 14 nicklas 94   histology.onParaffinBlockSelected = function(event)
2794 13 Oct 14 nicklas 95   {
2794 13 Oct 14 nicklas 96     var pb = event.detail;
2794 13 Oct 14 nicklas 97     Wizard.setInputStatus('plates');
2794 13 Oct 14 nicklas 98     
2794 13 Oct 14 nicklas 99     var frm = document.forms['reggie'];
2794 13 Oct 14 nicklas 100     var plates = frm.plates;
2794 13 Oct 14 nicklas 101     for (var i = 0; i < plates.length; i++)
2794 13 Oct 14 nicklas 102     {
2794 13 Oct 14 nicklas 103       if (plates[i].value == pb.id)
2794 13 Oct 14 nicklas 104       {
2794 13 Oct 14 nicklas 105         plates[i].selected = true;
2794 13 Oct 14 nicklas 106         return;
2794 13 Oct 14 nicklas 107       }
2794 13 Oct 14 nicklas 108     }
2794 13 Oct 14 nicklas 109
2794 13 Oct 14 nicklas 110     var option = new Option(pb.name, pb.id, true, true);
2794 13 Oct 14 nicklas 111     plates[plates.length] = option;
2794 13 Oct 14 nicklas 112   }
2794 13 Oct 14 nicklas 113   
2794 13 Oct 14 nicklas 114   histology.validateStep1 = function(event)
2794 13 Oct 14 nicklas 115   {
2794 13 Oct 14 nicklas 116     var frm = document.forms['reggie'];
2794 13 Oct 14 nicklas 117     
2794 13 Oct 14 nicklas 118     if (frm.plates.selectedIndex == -1)
2794 13 Oct 14 nicklas 119     {
2794 13 Oct 14 nicklas 120       Wizard.setInputStatus('plates', 'invalid', 'No paraffin block selected.');
2794 13 Oct 14 nicklas 121       event.preventDefault();
2794 13 Oct 14 nicklas 122     }
2794 13 Oct 14 nicklas 123   }
2794 13 Oct 14 nicklas 124   
2794 13 Oct 14 nicklas 125   histology.initializeStep2 = function()
2794 13 Oct 14 nicklas 126   {
2794 13 Oct 14 nicklas 127     var frm = document.forms['reggie'];
2794 13 Oct 14 nicklas 128     
2794 13 Oct 14 nicklas 129     Reggie.loadProtocols('STAINING_PROTOCOL', 'stainingProtocol');
2794 13 Oct 14 nicklas 130     
2794 13 Oct 14 nicklas 131     var url = '../Histology.servlet?ID='+App.getSessionId();
2794 13 Oct 14 nicklas 132     url += '&cmd=GetParaffinBlockInfo&bioPlateId='+frm.plates.value;    
2794 13 Oct 14 nicklas 133     Wizard.showLoadingAnimation('Loading paraffin block information...');
2794 13 Oct 14 nicklas 134     Wizard.asyncJsonRequest(url, histology.paraffinBlockInfoLoaded);
2794 13 Oct 14 nicklas 135   }
2794 13 Oct 14 nicklas 136
2794 13 Oct 14 nicklas 137   histology.paraffinBlockInfoLoaded = function(response)
2794 13 Oct 14 nicklas 138   {
2794 13 Oct 14 nicklas 139     var frm = document.forms['reggie'];
2794 13 Oct 14 nicklas 140     
2794 13 Oct 14 nicklas 141     paraffinBlock = response.paraffinBlock;
2794 13 Oct 14 nicklas 142     
2794 13 Oct 14 nicklas 143     var heGlass = paraffinBlock.heGlass;
2794 13 Oct 14 nicklas 144     var wellMap = [1, 0, 3, 2, 5, 4]; // Map well on Paraffin block to well on HEglass
2794 13 Oct 14 nicklas 145     
2794 13 Oct 14 nicklas 146     Doc.element('blockName').innerHTML = Strings.encodeTags(paraffinBlock.name);
2794 13 Oct 14 nicklas 147     frm.comment.value = paraffinBlock.comment;
2794 13 Oct 14 nicklas 148
2794 13 Oct 14 nicklas 149     if (heGlass) 
2794 13 Oct 14 nicklas 150     {
2794 13 Oct 14 nicklas 151       frm.numberOfHEGlass.value = heGlass.length;
2794 13 Oct 14 nicklas 152       existingNumberOfHEGlass = heGlass.length;
2794 13 Oct 14 nicklas 153     }
3119 06 Feb 15 nicklas 154     else
3119 06 Feb 15 nicklas 155     {
3119 06 Feb 15 nicklas 156       existingNumberOfHEGlass = 0;
3119 06 Feb 15 nicklas 157     }
2794 13 Oct 14 nicklas 158     
2794 13 Oct 14 nicklas 159     var numWells = 0;
2794 13 Oct 14 nicklas 160     for (var i = 0; i < paraffinBlock.bioWells.length; i++)
2794 13 Oct 14 nicklas 161     {
2794 13 Oct 14 nicklas 162       var well = paraffinBlock.bioWells[i];
2794 13 Oct 14 nicklas 163       var div = Doc.element('his.' + well.row + '.' + well.column);
2794 13 Oct 14 nicklas 164       if (div && well.bioMaterial)
2794 13 Oct 14 nicklas 165       {
2794 13 Oct 14 nicklas 166         div.innerHTML = Strings.encodeTags(well.bioMaterial.name);
6646 17 Mar 22 nicklas 167         Doc.show('input.' + well.row + '.' + well.column);
6646 17 Mar 22 nicklas 168         usedWells[usedWells.length] = 'idx.' + well.row + '.' + well.column;
2794 13 Oct 14 nicklas 169
2794 13 Oct 14 nicklas 170         if (heGlass)
2794 13 Oct 14 nicklas 171         {
2794 13 Oct 14 nicklas 172           Doc.element('existingGlass').innerHTML = '<img src="../images/info.png">There are ' + heGlass.length + ' HE glass plates already registered for this paraffin block.';
2794 13 Oct 14 nicklas 173           Doc.show('existingGlass');
2794 13 Oct 14 nicklas 174           
2794 13 Oct 14 nicklas 175           // Try to find the current "GoodStain" annotation on a child biomaterial
2794 13 Oct 14 nicklas 176           var goodStain = 0;
2794 13 Oct 14 nicklas 177           for (var j = 0; j < heGlass.length; j++)
2794 13 Oct 14 nicklas 178           {
2794 13 Oct 14 nicklas 179             var heWell = heGlass[j].bioWells[wellMap[i]];
2794 13 Oct 14 nicklas 180             if (heWell.bioMaterial && heWell.bioMaterial.GoodStain)
2794 13 Oct 14 nicklas 181             {
2794 13 Oct 14 nicklas 182               goodStain = j+1;
2794 13 Oct 14 nicklas 183               break;
2794 13 Oct 14 nicklas 184             }
2794 13 Oct 14 nicklas 185           }
2794 13 Oct 14 nicklas 186           var field = 'idx.'+well.row + '.' + well.column;
2794 13 Oct 14 nicklas 187           frm[field].value = goodStain;
2794 13 Oct 14 nicklas 188           histology.checkIndexValue(field);
2794 13 Oct 14 nicklas 189         }
2794 13 Oct 14 nicklas 190         frm['comment.'+well.row+'.'+well.column].value = well.bioMaterial.comment;
2794 13 Oct 14 nicklas 191         numWells++;
2794 13 Oct 14 nicklas 192       }
2794 13 Oct 14 nicklas 193     }
2794 13 Oct 14 nicklas 194     
6646 17 Mar 22 nicklas 195     if (numWells == 0)
2794 13 Oct 14 nicklas 196     {
6646 17 Mar 22 nicklas 197       Wizard.setFatalError('There are no histology items on this paraffin block.');
2794 13 Oct 14 nicklas 198       return;
2794 13 Oct 14 nicklas 199     }
6646 17 Mar 22 nicklas 200     else if (numWells < 5)
6646 17 Mar 22 nicklas 201     {
6646 17 Mar 22 nicklas 202       var emptyLocations = numWells==4 ? '1 empty location' : (5-numWells)+' empty locations';
6646 17 Mar 22 nicklas 203       Wizard.showGoNextConfirmation(false, 'There is '+emptyLocations+' on this paraffin block.');
6646 17 Mar 22 nicklas 204     }
2794 13 Oct 14 nicklas 205     
2794 13 Oct 14 nicklas 206     Wizard.setCurrentStep(2);
2794 13 Oct 14 nicklas 207     Doc.show('gonext');
2794 13 Oct 14 nicklas 208     Doc.show('gocancel');
2794 13 Oct 14 nicklas 209     frm.stainDate.focus();
2794 13 Oct 14 nicklas 210   }
2794 13 Oct 14 nicklas 211
2794 13 Oct 14 nicklas 212   histology.checkNumHEGlass = function()
2794 13 Oct 14 nicklas 213   {
2794 13 Oct 14 nicklas 214     var frm = document.forms['reggie'];
2794 13 Oct 14 nicklas 215     numHEGlassIsValid = false;
2794 13 Oct 14 nicklas 216     
2794 13 Oct 14 nicklas 217     var numHEGlass = parseInt(frm.numberOfHEGlass.value, 10) || 0;
2794 13 Oct 14 nicklas 218     var limit = Math.max(1, existingNumberOfHEGlass);
2794 13 Oct 14 nicklas 219     if (numHEGlass < limit)
2794 13 Oct 14 nicklas 220     {
2794 13 Oct 14 nicklas 221       Wizard.setInputStatus('numberOfHEGlass', 'invalid', 'Must be a value &gt;= ' + limit);
2794 13 Oct 14 nicklas 222       return;
2794 13 Oct 14 nicklas 223     }
2794 13 Oct 14 nicklas 224     
2794 13 Oct 14 nicklas 225     Wizard.setInputStatus('numberOfHEGlass', 'valid');
2794 13 Oct 14 nicklas 226     numHEGlassIsValid = true;
2794 13 Oct 14 nicklas 227     
6646 17 Mar 22 nicklas 228     for (var i = 0; i < usedWells.length; i++)
2794 13 Oct 14 nicklas 229     {
6646 17 Mar 22 nicklas 230       histology.checkIndexValue(usedWells[i]);
2794 13 Oct 14 nicklas 231     }
2794 13 Oct 14 nicklas 232
2794 13 Oct 14 nicklas 233   }
2794 13 Oct 14 nicklas 234
2794 13 Oct 14 nicklas 235   
2794 13 Oct 14 nicklas 236   histology.checkIndexValue = function(field)
2794 13 Oct 14 nicklas 237   {
2794 13 Oct 14 nicklas 238     // Can be called with either a ID or an Event object
2794 13 Oct 14 nicklas 239     if (field.currentTarget) field = field.currentTarget.id;
2794 13 Oct 14 nicklas 240
2794 13 Oct 14 nicklas 241     wellIsValid[field] = false;
2794 13 Oct 14 nicklas 242     
2794 13 Oct 14 nicklas 243     var frm = document.forms['reggie'];
2794 13 Oct 14 nicklas 244     var numHEGlass = parseInt(frm.numberOfHEGlass.value, 10) || 1;
2794 13 Oct 14 nicklas 245     var indexValue = parseInt(frm[field].value, 10);
2794 13 Oct 14 nicklas 246
2794 13 Oct 14 nicklas 247     if (isNaN(indexValue) || indexValue < 0 || indexValue > numHEGlass)
2794 13 Oct 14 nicklas 248     {
2794 13 Oct 14 nicklas 249       Wizard.setInputStatus(field, 'invalid');
2794 13 Oct 14 nicklas 250       Wizard.setInputStatus('index', '', 'Must be between 1–'+numHEGlass + ' (or 0 if no good stain)');
2794 13 Oct 14 nicklas 251       return;
2794 13 Oct 14 nicklas 252     }
2794 13 Oct 14 nicklas 253
2794 13 Oct 14 nicklas 254     wellIsValid[field] = true;
2794 13 Oct 14 nicklas 255     if (indexValue == 0)
2794 13 Oct 14 nicklas 256     {
2794 13 Oct 14 nicklas 257       Wizard.setInputStatus(field, 'flag', 'No good stain! Sample will be flagged and saved to Flagged Histology list.');
2794 13 Oct 14 nicklas 258     }
2794 13 Oct 14 nicklas 259     else
2794 13 Oct 14 nicklas 260     {
2794 13 Oct 14 nicklas 261       Wizard.setInputStatus(field, 'valid');
2794 13 Oct 14 nicklas 262     }
2794 13 Oct 14 nicklas 263
2794 13 Oct 14 nicklas 264     Wizard.setInputStatus('index');
2794 13 Oct 14 nicklas 265   }
2794 13 Oct 14 nicklas 266
2794 13 Oct 14 nicklas 267   
2794 13 Oct 14 nicklas 268   histology.validateStep2 = function(event)
2794 13 Oct 14 nicklas 269   {
2794 13 Oct 14 nicklas 270     var valid = Wizard.isValid('stainDate');
2794 13 Oct 14 nicklas 271     valid &= numHEGlassIsValid;
2794 13 Oct 14 nicklas 272     
6646 17 Mar 22 nicklas 273     for (var i = 0; i < usedWells.length; i++)
2794 13 Oct 14 nicklas 274     {
6646 17 Mar 22 nicklas 275       var w = usedWells[i]
2794 13 Oct 14 nicklas 276       if (!wellIsValid[w])
2794 13 Oct 14 nicklas 277       {
2794 13 Oct 14 nicklas 278         Wizard.setInputStatus(w, 'invalid');
2794 13 Oct 14 nicklas 279         valid = false;
2794 13 Oct 14 nicklas 280       }
2794 13 Oct 14 nicklas 281     }
2794 13 Oct 14 nicklas 282     if (!valid) event.preventDefault();
2794 13 Oct 14 nicklas 283   }
2794 13 Oct 14 nicklas 284   
2794 13 Oct 14 nicklas 285   histology.initializeStep3 = function()
2794 13 Oct 14 nicklas 286   {
2794 13 Oct 14 nicklas 287     var url = '../Histology.servlet?ID='+App.getSessionId();
2794 13 Oct 14 nicklas 288     url += '&cmd=FindLastUsedHeGlassPosition';
2794 13 Oct 14 nicklas 289     Wizard.showLoadingAnimation('Loading HE glass information...');
2794 13 Oct 14 nicklas 290     Wizard.asyncJsonRequest(url, histology.heGlassInfoLoaded);
2794 13 Oct 14 nicklas 291   }
2794 13 Oct 14 nicklas 292   
2794 13 Oct 14 nicklas 293   histology.heGlassInfoLoaded = function(response)
2794 13 Oct 14 nicklas 294   {
2794 13 Oct 14 nicklas 295     var frm = document.forms['reggie'];
2794 13 Oct 14 nicklas 296     
2794 13 Oct 14 nicklas 297     var numHEGlass = parseInt(frm.numberOfHEGlass.value, 10);
3125 09 Feb 15 nicklas 298     
3125 09 Feb 15 nicklas 299     // Set flag for slides with at least one good stain item
3125 09 Feb 15 nicklas 300     var hasGoodStain = [];
6646 17 Mar 22 nicklas 301     for (var i = 0; i < usedWells.length; i++)
3125 09 Feb 15 nicklas 302     {
6646 17 Mar 22 nicklas 303       var w = usedWells[i];
3125 09 Feb 15 nicklas 304       var glassNo = parseInt(frm[w].value, 10) - 1; 
3125 09 Feb 15 nicklas 305       hasGoodStain[glassNo] = true;
3125 09 Feb 15 nicklas 306     }
6646 17 Mar 22 nicklas 307
2794 13 Oct 14 nicklas 308     var lastHeGlassPosition = response;
3121 06 Feb 15 nicklas 309     var ihcValues = response.ihc;
2794 13 Oct 14 nicklas 310     
3121 06 Feb 15 nicklas 311     var ihcOptions = '<option></option>';
3121 06 Feb 15 nicklas 312     for (var i = 0; i < ihcValues.length; i++)
3121 06 Feb 15 nicklas 313     {
3121 06 Feb 15 nicklas 314       var v = Strings.encodeTags(ihcValues[i]);
3121 06 Feb 15 nicklas 315       ihcOptions += '<option value="' + v + '">'+v+'</option>';
3121 06 Feb 15 nicklas 316     }
3121 06 Feb 15 nicklas 317     
2794 13 Oct 14 nicklas 318     var html = '<table id="glassTable">';
2794 13 Oct 14 nicklas 319     html += '<thead>';
2794 13 Oct 14 nicklas 320     // First header row
2794 13 Oct 14 nicklas 321     html += '<tr>';
2794 13 Oct 14 nicklas 322     html += '<th style="width: 10em;">HE glass</th>';
2794 13 Oct 14 nicklas 323     html += '<th style="width: 8em;">Storage box</th>';
2794 13 Oct 14 nicklas 324     html += '<th style="width: 8em;">Position</th>';
3126 10 Feb 15 nicklas 325     html += '<th style="width: 8em;">IHC¹</th>';
2794 13 Oct 14 nicklas 326     html += '<th style="width: 30em;">Comment</th>';
2794 13 Oct 14 nicklas 327     html += '<th style="width: 20px;">&nbsp;</th>';
2794 13 Oct 14 nicklas 328     html += '</tr>';
2794 13 Oct 14 nicklas 329     html += '</thead>';
2794 13 Oct 14 nicklas 330     html += '<tbody>';
2794 13 Oct 14 nicklas 331     
2794 13 Oct 14 nicklas 332     var glassNamePrefix = paraffinBlock.name.replace('PB', 'HE');
2794 13 Oct 14 nicklas 333     var heGlass = paraffinBlock.heGlass;
2794 13 Oct 14 nicklas 334     for (var glassNo = 0; glassNo < numHEGlass; glassNo++)
2794 13 Oct 14 nicklas 335     {
2794 13 Oct 14 nicklas 336       var heSlide;
2794 13 Oct 14 nicklas 337       if (heGlass && heGlass[glassNo])
2794 13 Oct 14 nicklas 338       {
2794 13 Oct 14 nicklas 339         heSlide = heGlass[glassNo];
2794 13 Oct 14 nicklas 340       }
2794 13 Oct 14 nicklas 341       else
2794 13 Oct 14 nicklas 342       {
3125 09 Feb 15 nicklas 343         heSlide = {};
2794 13 Oct 14 nicklas 344         heSlide.name = glassNamePrefix + '.' + (glassNo+1);
2794 13 Oct 14 nicklas 345       }
2794 13 Oct 14 nicklas 346       if (!heSlide.position)
2794 13 Oct 14 nicklas 347       {
2794 13 Oct 14 nicklas 348         if (lastHeGlassPosition && lastHeGlassPosition.position)
2794 13 Oct 14 nicklas 349         {
2794 13 Oct 14 nicklas 350           heSlide.position = ++lastHeGlassPosition.position;
2794 13 Oct 14 nicklas 351           if (heSlide.position > 100)
2794 13 Oct 14 nicklas 352           {
2794 13 Oct 14 nicklas 353             heSlide.position = 1;
2794 13 Oct 14 nicklas 354             lastHeGlassPosition.position = 1;
2794 13 Oct 14 nicklas 355             lastHeGlassPosition.storageBox++;
2794 13 Oct 14 nicklas 356           }
2794 13 Oct 14 nicklas 357           heSlide.storageBox = lastHeGlassPosition.storageBox;
2794 13 Oct 14 nicklas 358         }
2794 13 Oct 14 nicklas 359         else
2794 13 Oct 14 nicklas 360         {
2794 13 Oct 14 nicklas 361           heSlide.position = '';
2794 13 Oct 14 nicklas 362           heSlide.storageBox = '';
2794 13 Oct 14 nicklas 363         }
2794 13 Oct 14 nicklas 364       }
2794 13 Oct 14 nicklas 365
2794 13 Oct 14 nicklas 366       html += '<tr>';
2794 13 Oct 14 nicklas 367       html += '<td>' + Strings.encodeTags(heSlide.name) + '</td>';
3121 06 Feb 15 nicklas 368       html += '<td><input type="text" class="required" name="glassBox.'+glassNo+'" id="glassBox.'+glassNo+'" value="'+heSlide.storageBox+'" style="width: 5em;"></td>';
3121 06 Feb 15 nicklas 369       html += '<td><input type="text" class="required" name="position.'+glassNo+'" id="position.'+glassNo+'" value="'+heSlide.position+'" style="width: 5em;"></td>';
3125 09 Feb 15 nicklas 370       html += '<td>';
3125 09 Feb 15 nicklas 371       if (!hasGoodStain[glassNo] || heSlide.IHC)
3125 09 Feb 15 nicklas 372       {
3125 09 Feb 15 nicklas 373         html += '<select name="ihc.'+glassNo+'" id="ihc.'+glassNo+'" style="width: 5em;">'+ihcOptions+'</select>';
3125 09 Feb 15 nicklas 374       }
3125 09 Feb 15 nicklas 375       html += '</td>';
2794 13 Oct 14 nicklas 376       html += '<td><input type="text" name="comment.'+glassNo+'"id="comment.'+glassNo+'" style="width: 95%;"></td>';
2794 13 Oct 14 nicklas 377       html += '<td class="status" id="glassBox.'+glassNo+'.status"></td>';
2794 13 Oct 14 nicklas 378       html += '</tr>';
2794 13 Oct 14 nicklas 379       
2794 13 Oct 14 nicklas 380     }
2794 13 Oct 14 nicklas 381     html += '</tbody>';
2794 13 Oct 14 nicklas 382     html += '</table>';
2794 13 Oct 14 nicklas 383     
2794 13 Oct 14 nicklas 384     Doc.element('glassBoxInput').innerHTML = html;
2794 13 Oct 14 nicklas 385     
2794 13 Oct 14 nicklas 386     for (var glassNo = 0; glassNo < numHEGlass; glassNo++)
2794 13 Oct 14 nicklas 387     {
2794 13 Oct 14 nicklas 388       if (heGlass && heGlass[glassNo])
2794 13 Oct 14 nicklas 389       {
2794 13 Oct 14 nicklas 390         frm['comment.'+glassNo].value = heGlass[glassNo].comment;
3125 09 Feb 15 nicklas 391         if (frm['ihc.'+glassNo])
3125 09 Feb 15 nicklas 392         {
3125 09 Feb 15 nicklas 393           Forms.selectListOption(frm['ihc.'+glassNo], heGlass[glassNo].IHC);
3125 09 Feb 15 nicklas 394         }
2794 13 Oct 14 nicklas 395       }
2794 13 Oct 14 nicklas 396       
2794 13 Oct 14 nicklas 397       Events.addEventHandler('glassBox.'+glassNo, 'keypress', Wizard.focusOnEnter, {'next-focus': 'position.'+glassNo});
2794 13 Oct 14 nicklas 398       Events.addEventHandler('position.'+glassNo, 'keypress', Wizard.focusOnEnter, {'next-focus': 'comment.'+glassNo});
2794 13 Oct 14 nicklas 399       Events.addEventHandler('comment.'+glassNo, 'keypress', Wizard.focusOnEnter, {'next-focus': 'glassBox.'+(glassNo+1)});
2794 13 Oct 14 nicklas 400       
2794 13 Oct 14 nicklas 401       Events.addEventHandler('glassBox.'+glassNo, 'keypress', Events.integerOnly);
2794 13 Oct 14 nicklas 402       Events.addEventHandler('position.'+glassNo, 'keypress', Events.integerOnly);
2794 13 Oct 14 nicklas 403
2794 13 Oct 14 nicklas 404       Events.addEventHandler('glassBox.'+glassNo, 'change', histology.glassBoxOnChange, {'index': glassNo});
2794 13 Oct 14 nicklas 405       Events.addEventHandler('position.'+glassNo, 'change', histology.glassBoxOnChange, {'index': glassNo});
2794 13 Oct 14 nicklas 406       Events.sendChangeEvent('glassBox.'+glassNo);
2794 13 Oct 14 nicklas 407     }
2794 13 Oct 14 nicklas 408
2794 13 Oct 14 nicklas 409     Wizard.setCurrentStep(3);
2794 13 Oct 14 nicklas 410     Doc.show('goregister');
2794 13 Oct 14 nicklas 411     Doc.show('gocancel');
2794 13 Oct 14 nicklas 412     frm['glassBox.0'].focus();
2794 13 Oct 14 nicklas 413   }
2794 13 Oct 14 nicklas 414   
2794 13 Oct 14 nicklas 415   histology.glassBoxOnChange = function(event)
2794 13 Oct 14 nicklas 416   {
2794 13 Oct 14 nicklas 417     var frm = document.forms['reggie'];
2794 13 Oct 14 nicklas 418     var glassNo = Data.int(event.currentTarget, 'index');
2794 13 Oct 14 nicklas 419     
2794 13 Oct 14 nicklas 420     glassBoxIsValid[glassNo] = false;
2794 13 Oct 14 nicklas 421     
2794 13 Oct 14 nicklas 422     if (frm['glassBox.'+glassNo].value == '')
2794 13 Oct 14 nicklas 423     {
2794 13 Oct 14 nicklas 424       Wizard.setInputStatus('glassBox.'+glassNo, 'invalid', 'Missing storage box');
2794 13 Oct 14 nicklas 425       return;
2794 13 Oct 14 nicklas 426     }
2794 13 Oct 14 nicklas 427     if (frm['position.'+glassNo].value == '')
2794 13 Oct 14 nicklas 428     {
2794 13 Oct 14 nicklas 429       Wizard.setInputStatus('glassBox.'+glassNo, 'invalid', 'Missing position');
2794 13 Oct 14 nicklas 430       return;
2794 13 Oct 14 nicklas 431     }
2794 13 Oct 14 nicklas 432     
2794 13 Oct 14 nicklas 433     glassBoxIsValid[glassNo] = true;
3119 06 Feb 15 nicklas 434     Wizard.setInputStatus('glassBox.'+glassNo, paraffinBlock.heGlass && paraffinBlock.heGlass[glassNo] ? 'valid' : 'new');
2794 13 Oct 14 nicklas 435   }
2794 13 Oct 14 nicklas 436
2794 13 Oct 14 nicklas 437   histology.validateStep3 = function(event)
2794 13 Oct 14 nicklas 438   {
2794 13 Oct 14 nicklas 439     var valid = true;
2794 13 Oct 14 nicklas 440     for (var glassNo = 0; glassNo < glassBoxIsValid.length; glassNo++)
2794 13 Oct 14 nicklas 441     {
2794 13 Oct 14 nicklas 442       valid &= glassBoxIsValid[glassNo];
2794 13 Oct 14 nicklas 443     }
2794 13 Oct 14 nicklas 444     
2794 13 Oct 14 nicklas 445     if (!valid) event.preventDefault();
2794 13 Oct 14 nicklas 446   }
2794 13 Oct 14 nicklas 447   
2794 13 Oct 14 nicklas 448   histology.submit = function()
2794 13 Oct 14 nicklas 449   {
2794 13 Oct 14 nicklas 450     var frm = document.forms['reggie'];
2794 13 Oct 14 nicklas 451
2794 13 Oct 14 nicklas 452     for (var i = 0; i < paraffinBlock.bioWells.length; i++)
2794 13 Oct 14 nicklas 453     {
2794 13 Oct 14 nicklas 454       var well = paraffinBlock.bioWells[i];
2794 13 Oct 14 nicklas 455       var field = 'idx.'+ well.row + '.' + well.column;
6646 17 Mar 22 nicklas 456       if (well.bioMaterial && frm[field])
2794 13 Oct 14 nicklas 457       {
2794 13 Oct 14 nicklas 458         well.GoodStain = parseInt(frm[field].value, 10);
2794 13 Oct 14 nicklas 459         well.bioMaterial.comment = frm['comment.'+well.row+'.'+well.column].value;
2794 13 Oct 14 nicklas 460       }
2794 13 Oct 14 nicklas 461     }
2794 13 Oct 14 nicklas 462     
2794 13 Oct 14 nicklas 463     if (!paraffinBlock.heGlass) 
2794 13 Oct 14 nicklas 464     {
2794 13 Oct 14 nicklas 465       paraffinBlock.heGlass = [];
2794 13 Oct 14 nicklas 466     }
2794 13 Oct 14 nicklas 467     
2794 13 Oct 14 nicklas 468     var glassNo = 0;
2794 13 Oct 14 nicklas 469     while (frm['glassBox.'+glassNo])
2794 13 Oct 14 nicklas 470     {
2794 13 Oct 14 nicklas 471       if (paraffinBlock.heGlass.length <= glassNo)
2794 13 Oct 14 nicklas 472       {
2794 13 Oct 14 nicklas 473         paraffinBlock.heGlass[glassNo] = {};
2794 13 Oct 14 nicklas 474       }
2794 13 Oct 14 nicklas 475       var heGlass = paraffinBlock.heGlass[glassNo];
2794 13 Oct 14 nicklas 476       heGlass.storageBox = frm['glassBox.'+glassNo].value;
2794 13 Oct 14 nicklas 477       heGlass.position = frm['position.'+glassNo].value;
3125 09 Feb 15 nicklas 478       if (frm['ihc.'+glassNo])
3125 09 Feb 15 nicklas 479       {
3125 09 Feb 15 nicklas 480         heGlass.IHC = frm['ihc.'+glassNo].value;
3125 09 Feb 15 nicklas 481       }
2794 13 Oct 14 nicklas 482       heGlass.comment = frm['comment.'+glassNo].value;
2794 13 Oct 14 nicklas 483       glassNo++;
2794 13 Oct 14 nicklas 484     }
2794 13 Oct 14 nicklas 485     
2794 13 Oct 14 nicklas 486     var submitInfo = {};
2794 13 Oct 14 nicklas 487     paraffinBlock.stainDate = frm.stainDate.value;
2794 13 Oct 14 nicklas 488     paraffinBlock.protocolId = parseInt(frm.stainingProtocol.value, 10);
2794 13 Oct 14 nicklas 489     paraffinBlock.comment = frm.comment.value;
2794 13 Oct 14 nicklas 490     submitInfo.paraffinBlock = paraffinBlock;
2794 13 Oct 14 nicklas 491     
2794 13 Oct 14 nicklas 492     var url = '../Histology.servlet?ID='+App.getSessionId();
2794 13 Oct 14 nicklas 493     url += '&cmd=RegisterHEGlass';
2794 13 Oct 14 nicklas 494     Wizard.showLoadingAnimation('Performing registration...');
2794 13 Oct 14 nicklas 495     Wizard.asyncJsonRequest(url, histology.submissionResults, 'POST', JSON.stringify(submitInfo));
2794 13 Oct 14 nicklas 496   }
2794 13 Oct 14 nicklas 497     
2794 13 Oct 14 nicklas 498   histology.submissionResults = function(response)
2794 13 Oct 14 nicklas 499   {
2794 13 Oct 14 nicklas 500     Wizard.showFinalMessage(response.messages);
2794 13 Oct 14 nicklas 501     Doc.show('gorestart');
2794 13 Oct 14 nicklas 502   }
2794 13 Oct 14 nicklas 503
2794 13 Oct 14 nicklas 504   return histology;
2794 13 Oct 14 nicklas 505 }();
2794 13 Oct 14 nicklas 506
2794 13 Oct 14 nicklas 507 Doc.onLoad(Histology.initPage);
2794 13 Oct 14 nicklas 508