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

Code
Comments
Other
Rev Date Author Line
2677 17 Sep 14 nicklas 1 var SpecimenTubeReg = function()
2677 17 Sep 14 nicklas 2 {
2677 17 Sep 14 nicklas 3   var streg = {};
2702 26 Sep 14 nicklas 4   var debug = 0;
2677 17 Sep 14 nicklas 5   
2677 17 Sep 14 nicklas 6   var caseInfo;
5345 02 Apr 19 nicklas 7   var siteInfo;
5333 28 Mar 19 nicklas 8   var freeWells;
5333 28 Mar 19 nicklas 9   var freePausedWells;
2677 17 Sep 14 nicklas 10   
2677 17 Sep 14 nicklas 11   var nofTubesIsValid = false;
2677 17 Sep 14 nicklas 12   var samplingDateIsValid = true;
2677 17 Sep 14 nicklas 13   var rnaLaterDateIsValid = true;
2677 17 Sep 14 nicklas 14   var lateralityIsValid = true;
2677 17 Sep 14 nicklas 15   var biopsyTypeIsValid = true;
2677 17 Sep 14 nicklas 16
2677 17 Sep 14 nicklas 17   var wellIsValid = [];
2677 17 Sep 14 nicklas 18   
2677 17 Sep 14 nicklas 19   var restartTimer;
2677 17 Sep 14 nicklas 20   var restartAt;
2677 17 Sep 14 nicklas 21   
2677 17 Sep 14 nicklas 22   // Page initialization
2677 17 Sep 14 nicklas 23   streg.initPage = function()
2677 17 Sep 14 nicklas 24   {
2677 17 Sep 14 nicklas 25     // Step 1
2677 17 Sep 14 nicklas 26     Events.addEventHandler('step-1', 'wizard-validate', streg.validateStep1);
2677 17 Sep 14 nicklas 27     Events.addEventHandler('caseName', 'keypress', Wizard.goNextOnTabOrEnter);
2677 17 Sep 14 nicklas 28     
2677 17 Sep 14 nicklas 29     // Step 2
2677 17 Sep 14 nicklas 30     Events.addEventHandler('step-2', 'wizard-initialize', streg.initializeStep2);
2677 17 Sep 14 nicklas 31     Events.addEventHandler('step-2', 'wizard-validate', streg.validateStep2);
2842 20 Oct 14 nicklas 32     Events.addEventHandler('nofTubes', 'keypress', Events.integerOnly);
2677 17 Sep 14 nicklas 33     Events.addEventHandler('nofTubes', 'blur', streg.nofTubesOnChange);
2677 17 Sep 14 nicklas 34     Events.addEventHandler('arrivalDate', 'blur', Wizard.validateDate);
2677 17 Sep 14 nicklas 35     Events.addEventHandler('samplingDate', 'blur', streg.samplingDateOnChange);
2677 17 Sep 14 nicklas 36     Events.addEventHandler('samplingTime', 'blur', streg.samplingDateOnChange);
2677 17 Sep 14 nicklas 37     Events.addEventHandler('rnaLaterDate', 'blur', streg.rnaLaterDateOnChange);
2677 17 Sep 14 nicklas 38     Events.addEventHandler('rnaLaterTime', 'blur', streg.rnaLaterDateOnChange);
2677 17 Sep 14 nicklas 39     
2677 17 Sep 14 nicklas 40     Events.addEventHandler('lateralityLEFT', 'click', streg.lateralityOnChange);
2677 17 Sep 14 nicklas 41     Events.addEventHandler('lateralityRIGHT', 'click', streg.lateralityOnChange);
2677 17 Sep 14 nicklas 42     Events.addEventHandler('lateralityU', 'click', streg.lateralityOnChange);
2677 17 Sep 14 nicklas 43     Events.addEventHandler('biopsyType', 'change', streg.biopsyTypeOnChange);
2677 17 Sep 14 nicklas 44     Events.addEventHandler('otherPathNote', 'keypress', Wizard.goNextOnTab);
2677 17 Sep 14 nicklas 45     
2677 17 Sep 14 nicklas 46     // Step 3
2677 17 Sep 14 nicklas 47     Events.addEventHandler('step-3', 'wizard-initialize', streg.initializeStep3);
2677 17 Sep 14 nicklas 48     Events.addEventHandler('step-3', 'wizard-validate', streg.validateStep3);
2677 17 Sep 14 nicklas 49     
2677 17 Sep 14 nicklas 50     // Navigation
2677 17 Sep 14 nicklas 51     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
2677 17 Sep 14 nicklas 52     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2677 17 Sep 14 nicklas 53     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2677 17 Sep 14 nicklas 54     Buttons.addClickHandler('goregister', Wizard.goRegister);
2677 17 Sep 14 nicklas 55     Buttons.addClickHandler('gostop', streg.stopAutoRestart);
2677 17 Sep 14 nicklas 56     
2677 17 Sep 14 nicklas 57     // Final registration
2677 17 Sep 14 nicklas 58     Events.addEventHandler('wizard', 'wizard-submit', streg.submit);
2677 17 Sep 14 nicklas 59
2677 17 Sep 14 nicklas 60     Doc.show('step-1');
2677 17 Sep 14 nicklas 61     Doc.show('gonext');
4546 29 Jun 17 nicklas 62
4546 29 Jun 17 nicklas 63     // Load counters for storage box check
4546 29 Jun 17 nicklas 64     var url = '../Session.servlet?ID='+App.getSessionId();
4546 29 Jun 17 nicklas 65     url += '&cmd=GetCounters'
4546 29 Jun 17 nicklas 66     Wizard.asyncJsonRequest(url, streg.countersLoaded);
2677 17 Sep 14 nicklas 67   }
2677 17 Sep 14 nicklas 68
4546 29 Jun 17 nicklas 69   streg.countersLoaded = function(response)
4546 29 Jun 17 nicklas 70   {
4546 29 Jun 17 nicklas 71     if (response.counts)
4546 29 Jun 17 nicklas 72     {
4546 29 Jun 17 nicklas 73       var emptyBoxes = response.counts['empty-storage-boxes'];
4546 29 Jun 17 nicklas 74       if (emptyBoxes < 2)
4546 29 Jun 17 nicklas 75       {
4546 29 Jun 17 nicklas 76         Wizard.showGoNextConfirmation(false, '<span class="moreboxes">There is only ' + emptyBoxes + ' empty storage box. Create more boxes with the <i>Storage box creation wizard</i>.</span>');
4546 29 Jun 17 nicklas 77       }
4546 29 Jun 17 nicklas 78     }
4546 29 Jun 17 nicklas 79   }
4546 29 Jun 17 nicklas 80   
2677 17 Sep 14 nicklas 81   streg.validateStep1 = function(event)
2677 17 Sep 14 nicklas 82   {
2677 17 Sep 14 nicklas 83     var frm = document.forms['reggie'];
2677 17 Sep 14 nicklas 84     
5276 05 Feb 19 nicklas 85     var caseName = frm.caseName.value.toUpperCase();
2677 17 Sep 14 nicklas 86     var caseIsValid = false;
2677 17 Sep 14 nicklas 87     Wizard.setInputStatus('caseName');
2677 17 Sep 14 nicklas 88     if (caseName == '')
2677 17 Sep 14 nicklas 89     {
2677 17 Sep 14 nicklas 90       Wizard.setInputStatus('caseName', 'invalid', 'Missing');
2677 17 Sep 14 nicklas 91       frm.caseName.focus();
2677 17 Sep 14 nicklas 92     }
2840 20 Oct 14 nicklas 93     else if (!Reggie.isValidCaseName(caseName, true))  // Allow C/D suffix to be used
2677 17 Sep 14 nicklas 94     {
2840 20 Oct 14 nicklas 95       Wizard.setInputStatus('caseName', 'invalid', 'Only 7-digits name + optional \'C\' or \'D\' is allowed.');
2677 17 Sep 14 nicklas 96       frm.caseName.focus();
2677 17 Sep 14 nicklas 97     }
2677 17 Sep 14 nicklas 98     else
2677 17 Sep 14 nicklas 99     {
2677 17 Sep 14 nicklas 100       Wizard.setInputStatus('caseName', 'valid');
5276 05 Feb 19 nicklas 101       frm.caseName.value = caseName;
2677 17 Sep 14 nicklas 102       caseIsValid = true;
2677 17 Sep 14 nicklas 103     }
2677 17 Sep 14 nicklas 104     
2677 17 Sep 14 nicklas 105     // If not valid, we prevent the wizard from moving to the next step
2677 17 Sep 14 nicklas 106     if (!caseIsValid) event.preventDefault();
2677 17 Sep 14 nicklas 107   }
2677 17 Sep 14 nicklas 108   
2677 17 Sep 14 nicklas 109   streg.initializeStep2 = function()
2677 17 Sep 14 nicklas 110   {
2677 17 Sep 14 nicklas 111     var frm = document.forms['reggie'];  
2677 17 Sep 14 nicklas 112     var caseName = frm.caseName.value;
2677 17 Sep 14 nicklas 113     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
2677 17 Sep 14 nicklas 114     url += '&cmd=GetCaseInfo';
2677 17 Sep 14 nicklas 115     url += '&caseName=' + encodeURIComponent(caseName);
2677 17 Sep 14 nicklas 116     
2677 17 Sep 14 nicklas 117     Wizard.showLoadingAnimation('Loading information about case...');
2677 17 Sep 14 nicklas 118     Wizard.asyncJsonRequest(url, streg.caseInfoLoaded);
2677 17 Sep 14 nicklas 119   }
2677 17 Sep 14 nicklas 120   
2677 17 Sep 14 nicklas 121   
2677 17 Sep 14 nicklas 122   streg.caseInfoLoaded = function(response)
2677 17 Sep 14 nicklas 123   {
2677 17 Sep 14 nicklas 124     var frm = document.forms['reggie'];  
2677 17 Sep 14 nicklas 125     caseInfo = response.caseInfo;
5345 02 Apr 19 nicklas 126     siteInfo = response.siteInfo;
2677 17 Sep 14 nicklas 127     
2677 17 Sep 14 nicklas 128     Wizard.setCurrentStep(2);
2677 17 Sep 14 nicklas 129     Doc.show('gocancel');
2677 17 Sep 14 nicklas 130     Doc.show('gonext');
2677 17 Sep 14 nicklas 131     
2677 17 Sep 14 nicklas 132     frm.arrivalDate.value = Dates.formatDate(new Date(), 'yyyyMMdd');
2677 17 Sep 14 nicklas 133
2677 17 Sep 14 nicklas 134     frm.nofTubes.focus();
2677 17 Sep 14 nicklas 135     frm.nofTubes.setSelectionRange(0,1);
2677 17 Sep 14 nicklas 136     
2677 17 Sep 14 nicklas 137     // Select 'Laterality' if we have that information since before
2677 17 Sep 14 nicklas 138     if (caseInfo.laterality)
2677 17 Sep 14 nicklas 139     {
2677 17 Sep 14 nicklas 140       Forms.checkRadio(frm.laterality, caseInfo.laterality);
2677 17 Sep 14 nicklas 141       streg.lateralityOnChange();
2677 17 Sep 14 nicklas 142       
2677 17 Sep 14 nicklas 143       if (caseInfo.laterality == 'LEFT') Doc.hide('lateralityRight');
2677 17 Sep 14 nicklas 144       if (caseInfo.laterality == 'RIGHT') Doc.hide('lateralityLeft');
2677 17 Sep 14 nicklas 145       Doc.hide('lateralityUnknown');
2677 17 Sep 14 nicklas 146       Doc.element('lateralityFromCase').innerHTML = '(From existing case: ' + Strings.encodeTags(caseInfo.name) + ')';
2677 17 Sep 14 nicklas 147       Doc.show('lateralityFromCase');
2677 17 Sep 14 nicklas 148     }
2677 17 Sep 14 nicklas 149     
2677 17 Sep 14 nicklas 150     
2677 17 Sep 14 nicklas 151     var caseName = frm.caseName.value;
2840 20 Oct 14 nicklas 152     if (caseName.length > 7)
2677 17 Sep 14 nicklas 153     {
2840 20 Oct 14 nicklas 154       var suffix = caseName.substring(7, 8);
2840 20 Oct 14 nicklas 155       if (suffix == 'C')
2840 20 Oct 14 nicklas 156       {
2840 20 Oct 14 nicklas 157         // Select 'SpecimenCoreBiopsy' if case name has 'C' suffix
2840 20 Oct 14 nicklas 158         Forms.selectListOption(frm.biopsyType, 'SpecimenCoreBiopsy');
2840 20 Oct 14 nicklas 159       }
2840 20 Oct 14 nicklas 160       else if (suffix == 'D')
2840 20 Oct 14 nicklas 161       {
2840 20 Oct 14 nicklas 162         // Select 'SpecimenCoreBiopsy2nd' if case name has 'D' suffix
2840 20 Oct 14 nicklas 163         Forms.selectListOption(frm.biopsyType, 'SpecimenCoreBiopsy2nd');
2840 20 Oct 14 nicklas 164       }
2677 17 Sep 14 nicklas 165       streg.biopsyTypeOnChange();
2677 17 Sep 14 nicklas 166     }
2677 17 Sep 14 nicklas 167   }
2677 17 Sep 14 nicklas 168   
2677 17 Sep 14 nicklas 169   streg.nofTubesOnChange = function()
2677 17 Sep 14 nicklas 170   {
2677 17 Sep 14 nicklas 171     nofTubesIsValid = false;
2677 17 Sep 14 nicklas 172
2677 17 Sep 14 nicklas 173     var frm = document.forms['reggie'];
2677 17 Sep 14 nicklas 174     var nofTubes = frm.nofTubes.value;
2677 17 Sep 14 nicklas 175     
2677 17 Sep 14 nicklas 176     if (nofTubes == '')
2677 17 Sep 14 nicklas 177     {
2677 17 Sep 14 nicklas 178       Wizard.setInputStatus('nofTubes', 'invalid', 'Missing');
2677 17 Sep 14 nicklas 179       return;
2677 17 Sep 14 nicklas 180     }
2677 17 Sep 14 nicklas 181     if (parseInt(nofTubes) < 1)
2677 17 Sep 14 nicklas 182     {
2677 17 Sep 14 nicklas 183       Wizard.setInputStatus('nofTubes', 'invalid', 'Must be at least 1');
4516 01 Jun 17 nicklas 184       return;
4516 01 Jun 17 nicklas 185     }
4516 01 Jun 17 nicklas 186     if (parseInt(nofTubes) > 9)
4516 01 Jun 17 nicklas 187     {
4516 01 Jun 17 nicklas 188       Wizard.setInputStatus('nofTubes', 'invalid', 'Must not be greater than 9');
2677 17 Sep 14 nicklas 189       return;    
2677 17 Sep 14 nicklas 190     }
2677 17 Sep 14 nicklas 191     Wizard.setInputStatus('nofTubes', 'valid');
2677 17 Sep 14 nicklas 192     nofTubesIsValid = true; 
2677 17 Sep 14 nicklas 193   }
2677 17 Sep 14 nicklas 194
2677 17 Sep 14 nicklas 195   
2677 17 Sep 14 nicklas 196   streg.samplingDateOnChange = function()
2677 17 Sep 14 nicklas 197   {
2677 17 Sep 14 nicklas 198     var frm = document.forms['reggie'];
2677 17 Sep 14 nicklas 199     
2677 17 Sep 14 nicklas 200     samplingDateIsValid = false;
2677 17 Sep 14 nicklas 201     Wizard.setInputStatus('samplingDate');
2677 17 Sep 14 nicklas 202     
2677 17 Sep 14 nicklas 203     var samplingDate = frm.samplingDate.value;
2677 17 Sep 14 nicklas 204     var samplingTime = frm.samplingTime.value;
2677 17 Sep 14 nicklas 205     
2677 17 Sep 14 nicklas 206     if (samplingDate != '' || samplingTime != '')
2677 17 Sep 14 nicklas 207     {
2677 17 Sep 14 nicklas 208       // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
2677 17 Sep 14 nicklas 209       samplingDate = Reggie.autoFillDate(samplingDate);
2677 17 Sep 14 nicklas 210       frm.samplingDate.value = samplingDate;
2677 17 Sep 14 nicklas 211
2677 17 Sep 14 nicklas 212       samplingTime = Reggie.autoFillTime(samplingTime);
2677 17 Sep 14 nicklas 213       frm.samplingTime.value = samplingTime;
2677 17 Sep 14 nicklas 214       
2677 17 Sep 14 nicklas 215       var d = Dates.parseString(samplingDate, 'yyyyMMdd');
2677 17 Sep 14 nicklas 216       if (d == null)
2677 17 Sep 14 nicklas 217       {
2677 17 Sep 14 nicklas 218         Wizard.setInputStatus('samplingDate', 'invalid', 'Not a valid date');
2677 17 Sep 14 nicklas 219         return;
2677 17 Sep 14 nicklas 220       }
2677 17 Sep 14 nicklas 221       
2677 17 Sep 14 nicklas 222       var today = new Date();
2677 17 Sep 14 nicklas 223       if (d.getTime() > today.getTime())
2677 17 Sep 14 nicklas 224       {
2677 17 Sep 14 nicklas 225         Wizard.setInputStatus('samplingDate', 'invalid', 'Future date is not valid');
2677 17 Sep 14 nicklas 226         return;
2677 17 Sep 14 nicklas 227       }
2677 17 Sep 14 nicklas 228       if (frm.rnaLaterDate.value == '') frm.rnaLaterDate.value = samplingDate;
2677 17 Sep 14 nicklas 229       
2677 17 Sep 14 nicklas 230       if (!Dates.isDate(samplingDate + ' ' + samplingTime, 'yyyyMMdd HHmm'))
2677 17 Sep 14 nicklas 231       {
2677 17 Sep 14 nicklas 232         if (samplingDate != '') 
2677 17 Sep 14 nicklas 233         {
2677 17 Sep 14 nicklas 234           Wizard.setInputStatus('samplingDate', 'invalid', 'Not a valid time (if time unknown, also leave date field blank)');
2677 17 Sep 14 nicklas 235         }
2677 17 Sep 14 nicklas 236         return;
2677 17 Sep 14 nicklas 237       }
2677 17 Sep 14 nicklas 238       Wizard.setInputStatus('samplingDate', 'valid');
2677 17 Sep 14 nicklas 239     }
2677 17 Sep 14 nicklas 240     samplingDateIsValid = true;
2677 17 Sep 14 nicklas 241     streg.rnaLaterDateOnChange();
2677 17 Sep 14 nicklas 242   }
2677 17 Sep 14 nicklas 243
2677 17 Sep 14 nicklas 244   
2677 17 Sep 14 nicklas 245   streg.rnaLaterDateOnChange = function()
2677 17 Sep 14 nicklas 246   {
2677 17 Sep 14 nicklas 247     var frm = document.forms['reggie'];
2677 17 Sep 14 nicklas 248
2677 17 Sep 14 nicklas 249     rnaLaterDateIsValid = false;
2677 17 Sep 14 nicklas 250     Wizard.setInputStatus('rnaLaterDate');
4996 03 Oct 18 nicklas 251     Wizard.hideGoNextConfirmation();
2677 17 Sep 14 nicklas 252     
2677 17 Sep 14 nicklas 253     var rnaLaterDate = frm.rnaLaterDate.value;
2677 17 Sep 14 nicklas 254     var rnaLaterTime = frm.rnaLaterTime.value;
2677 17 Sep 14 nicklas 255     
2677 17 Sep 14 nicklas 256     if (rnaLaterDate != '' || rnaLaterTime != '')
2677 17 Sep 14 nicklas 257     {
2677 17 Sep 14 nicklas 258       // Auto-fill the date if it's not given in yyyyMMdd
2677 17 Sep 14 nicklas 259       rnaLaterDate = Reggie.autoFillDate(rnaLaterDate);
2677 17 Sep 14 nicklas 260       frm.rnaLaterDate.value = rnaLaterDate;
2677 17 Sep 14 nicklas 261
2677 17 Sep 14 nicklas 262       rnaLaterTime = Reggie.autoFillTime(rnaLaterTime);
2677 17 Sep 14 nicklas 263       frm.rnaLaterTime.value = rnaLaterTime;
2677 17 Sep 14 nicklas 264       
2677 17 Sep 14 nicklas 265       var d = Dates.parseString(rnaLaterDate, 'yyyyMMdd');
2677 17 Sep 14 nicklas 266       if (d == null)
2677 17 Sep 14 nicklas 267       {
2677 17 Sep 14 nicklas 268         Wizard.setInputStatus('rnaLaterDate', 'invalid', 'Not a valid date');
2677 17 Sep 14 nicklas 269         return;
2677 17 Sep 14 nicklas 270       }
2677 17 Sep 14 nicklas 271       var today = new Date();
2677 17 Sep 14 nicklas 272       if (d.getTime() > today.getTime())
2677 17 Sep 14 nicklas 273       {
2677 17 Sep 14 nicklas 274         Wizard.setInputStatus('rnaLaterDate', 'invalid', 'Future date is not valid');
2677 17 Sep 14 nicklas 275         return;
2677 17 Sep 14 nicklas 276       }
2677 17 Sep 14 nicklas 277       
2677 17 Sep 14 nicklas 278       var rnaLaterTimestamp = Dates.parseString(rnaLaterDate + ' ' + rnaLaterTime, 'yyyyMMdd HHmm');
2677 17 Sep 14 nicklas 279       if (rnaLaterTimestamp == null)
2677 17 Sep 14 nicklas 280       {
2677 17 Sep 14 nicklas 281         if (rnaLaterDate != '') 
2677 17 Sep 14 nicklas 282         {
2677 17 Sep 14 nicklas 283           Wizard.setInputStatus('rnaLaterDate', 'invalid', 'Not a valid time (if time unknown, also leave date field blank)');
2677 17 Sep 14 nicklas 284         }
2677 17 Sep 14 nicklas 285         return;
2677 17 Sep 14 nicklas 286       }
4996 03 Oct 18 nicklas 287       // The date is valid, but we should also compare it to the sampling date
4996 03 Oct 18 nicklas 288       Wizard.setInputStatus('rnaLaterDate', 'valid');
2677 17 Sep 14 nicklas 289       if (samplingDateIsValid && rnaLaterTimestamp)
2677 17 Sep 14 nicklas 290       {
4996 03 Oct 18 nicklas 291         var samplingTimestamp = Dates.parseString(frm.samplingDate.value + ' ' + frm.samplingTime.value, 'yyyyMMdd Hmm');
4996 03 Oct 18 nicklas 292         var samplingDate = Dates.parseString(frm.samplingDate.value + ' 0000', 'yyyyMMdd Hmm'); // NOTE! Need to specify minutes otherwise we get the current time of day
4996 03 Oct 18 nicklas 293         
2677 17 Sep 14 nicklas 294         if (samplingTimestamp)
2677 17 Sep 14 nicklas 295         {
4996 03 Oct 18 nicklas 296           var timeToRNALaterInMinutes = (rnaLaterTimestamp.getTime() - samplingTimestamp.getTime()) / (1000 * 60);
4996 03 Oct 18 nicklas 297           if (timeToRNALaterInMinutes < 0)
2677 17 Sep 14 nicklas 298           {
4996 03 Oct 18 nicklas 299             Wizard.setInputStatus('rnaLaterDate', 'invalid', 'RNA later time must be later than Sampling time');
2677 17 Sep 14 nicklas 300             return;
2677 17 Sep 14 nicklas 301           }
4996 03 Oct 18 nicklas 302           
4996 03 Oct 18 nicklas 303           var daysToRnaLater = (rnaLaterTimestamp.getTime() - samplingDate.getTime()) / (1000 * 3600 * 24);
4996 03 Oct 18 nicklas 304           if (daysToRnaLater >= 2)
2677 17 Sep 14 nicklas 305           {
4996 03 Oct 18 nicklas 306             Wizard.setInputStatus('rnaLaterDate', 'invalid', 'Sampling and RNA later dates differ by more than 1 day');
2677 17 Sep 14 nicklas 307             return;
2677 17 Sep 14 nicklas 308           }
4996 03 Oct 18 nicklas 309           else if (daysToRnaLater >= 1)
4996 03 Oct 18 nicklas 310           {
4996 03 Oct 18 nicklas 311             Wizard.setInputStatus('rnaLaterDate', 'warning', 'Sampling and RNA later dates are different');
4996 03 Oct 18 nicklas 312             Wizard.showGoNextConfirmation(true, 'Verify that Sampling and RNA later dates are different');
4996 03 Oct 18 nicklas 313           }
2677 17 Sep 14 nicklas 314         }
2677 17 Sep 14 nicklas 315       }
2677 17 Sep 14 nicklas 316     }
2677 17 Sep 14 nicklas 317       
2677 17 Sep 14 nicklas 318     rnaLaterDateIsValid = true;
2677 17 Sep 14 nicklas 319   }
2677 17 Sep 14 nicklas 320
2677 17 Sep 14 nicklas 321   
2677 17 Sep 14 nicklas 322   streg.lateralityOnChange = function()
2677 17 Sep 14 nicklas 323   {  
2677 17 Sep 14 nicklas 324     lateralityIsValid = false;
2677 17 Sep 14 nicklas 325     
2677 17 Sep 14 nicklas 326     // Check selected laterality against specimen tubes
2677 17 Sep 14 nicklas 327     var frm = document.forms['reggie'];
2677 17 Sep 14 nicklas 328     var selectedLaterality = Forms.getCheckedRadio(frm.laterality);
2677 17 Sep 14 nicklas 329     
2677 17 Sep 14 nicklas 330     // No laterality/case selected
2677 17 Sep 14 nicklas 331     if (selectedLaterality == null) 
2677 17 Sep 14 nicklas 332     {
2677 17 Sep 14 nicklas 333       Wizard.setInputStatus('laterality', 'invalid', 'Not selected');
2677 17 Sep 14 nicklas 334       return;
2677 17 Sep 14 nicklas 335     }
2677 17 Sep 14 nicklas 336     
2677 17 Sep 14 nicklas 337     lateralityIsValid = true;
2677 17 Sep 14 nicklas 338
2677 17 Sep 14 nicklas 339     if (caseInfo.laterality && caseInfo.laterality != selectedLaterality.value)
2677 17 Sep 14 nicklas 340     {
2677 17 Sep 14 nicklas 341       Wizard.setInputStatus('laterality', 'warning', 'Not same laterality as existing case/specimen');  
2677 17 Sep 14 nicklas 342       return;
2677 17 Sep 14 nicklas 343     }
2677 17 Sep 14 nicklas 344     
2677 17 Sep 14 nicklas 345     Wizard.setInputStatus('laterality', 'valid');
2677 17 Sep 14 nicklas 346   }
2677 17 Sep 14 nicklas 347
2677 17 Sep 14 nicklas 348   streg.biopsyTypeOnChange = function()
2677 17 Sep 14 nicklas 349   {
2677 17 Sep 14 nicklas 350     var frm = document.forms['reggie'];
2677 17 Sep 14 nicklas 351     var selectedBiopsyType = frm.biopsyType.value;
2677 17 Sep 14 nicklas 352     biopsyTypeIsValid = false;
2677 17 Sep 14 nicklas 353     
2677 17 Sep 14 nicklas 354     // Check 'SpecimenCoreBiopsy' if case name has 'C' suffix
2677 17 Sep 14 nicklas 355     var caseName = frm.caseName.value;
2840 20 Oct 14 nicklas 356     var suffix = caseName.length > 7 ? caseName.substring(7, 8) : null;
2840 20 Oct 14 nicklas 357     if (suffix == 'C' && selectedBiopsyType != 'SpecimenCoreBiopsy')
2677 17 Sep 14 nicklas 358     {
2677 17 Sep 14 nicklas 359       Wizard.setInputStatus('biopsyType', 'invalid', 'Case name with \'C\' suffix is always SpecimenCoreBiopsy');
2677 17 Sep 14 nicklas 360       return;
2677 17 Sep 14 nicklas 361     }
2840 20 Oct 14 nicklas 362     if (suffix == 'D' && selectedBiopsyType != 'SpecimenCoreBiopsy2nd')
2840 20 Oct 14 nicklas 363     {
2840 20 Oct 14 nicklas 364       Wizard.setInputStatus('biopsyType', 'invalid', 'Case name with \'D\' suffix is always SpecimenCoreBiopsy2nd');
2840 20 Oct 14 nicklas 365       return;
2840 20 Oct 14 nicklas 366     }
2677 17 Sep 14 nicklas 367     
2677 17 Sep 14 nicklas 368     biopsyTypeIsValid = true;
2677 17 Sep 14 nicklas 369     Wizard.setInputStatus('biopsyType', 'valid');
2677 17 Sep 14 nicklas 370   }
2677 17 Sep 14 nicklas 371
2677 17 Sep 14 nicklas 372   
2677 17 Sep 14 nicklas 373   streg.validateStep2 = function(event)
2677 17 Sep 14 nicklas 374   {
2677 17 Sep 14 nicklas 375     var valid = true;
2677 17 Sep 14 nicklas 376
2677 17 Sep 14 nicklas 377     valid &= nofTubesIsValid;
2677 17 Sep 14 nicklas 378     valid &= Wizard.isValid('arrivalDate');
2677 17 Sep 14 nicklas 379     valid &= samplingDateIsValid;
2677 17 Sep 14 nicklas 380     valid &= rnaLaterDateIsValid;
2677 17 Sep 14 nicklas 381     valid &= lateralityIsValid;
2677 17 Sep 14 nicklas 382     valid &= biopsyTypeIsValid;
2677 17 Sep 14 nicklas 383     
2677 17 Sep 14 nicklas 384     if (!valid) event.preventDefault();
2677 17 Sep 14 nicklas 385   }
2677 17 Sep 14 nicklas 386
2677 17 Sep 14 nicklas 387   streg.initializeStep3 = function()
2677 17 Sep 14 nicklas 388   {
2677 17 Sep 14 nicklas 389     var frm = document.forms['reggie'];
2677 17 Sep 14 nicklas 390     var nofTubes = parseInt(frm.nofTubes.value);
2677 17 Sep 14 nicklas 391     if (nofTubes > 2) Doc.addClass('step-2', 'auto-hide');
2677 17 Sep 14 nicklas 392     
2677 17 Sep 14 nicklas 393     var html = '';
2677 17 Sep 14 nicklas 394     for (var i=0; i < nofTubes; i++)
2677 17 Sep 14 nicklas 395     {
5345 02 Apr 19 nicklas 396       var defaultPaused = siteInfo && siteInfo.paused;
5333 28 Mar 19 nicklas 397       
2801 13 Oct 14 nicklas 398       var tubeNo = i+caseInfo.specimenFirstIndex;
5333 28 Mar 19 nicklas 399       html += '<tbody id="specimenSection.'+i+'"' + (defaultPaused ? 'class="pause-specimen"' : '')+'>';
2677 17 Sep 14 nicklas 400       html += '<tr class="section-header">';
2801 13 Oct 14 nicklas 401       html += '<td colspan="4">Specimen Tube '+Strings.encodeTags(caseInfo.originalName)+'.'+tubeNo+'</td>';
2677 17 Sep 14 nicklas 402       html += '</tr>';
2677 17 Sep 14 nicklas 403
3602 16 Nov 15 nicklas 404       html += '<tr>';
3602 16 Nov 15 nicklas 405       html += '<td class="subprompt yellow-tag"><label for="yellowLabel.'+i+'">Yellow label</label></td>';
3602 16 Nov 15 nicklas 406       html += '<td class="input">';
3602 16 Nov 15 nicklas 407       html += '<input type="checkbox" name="yellowLabel.'+i+'" id="yellowLabel.'+i+'"></td>';
3602 16 Nov 15 nicklas 408       html += '<td class="status"></td>';
3602 16 Nov 15 nicklas 409       html += '<td class="help"></td>';    
3602 16 Nov 15 nicklas 410       html += '</tr>';
3602 16 Nov 15 nicklas 411       
2801 13 Oct 14 nicklas 412       html += '<tr>'
2801 13 Oct 14 nicklas 413       html += '<td class="subprompt">Specimen type</td>';
2801 13 Oct 14 nicklas 414       html += '<td class="input">';
2801 13 Oct 14 nicklas 415       html += '<select name="specimenType.'+i+'" id="specimenType.'+i+'">';
2801 13 Oct 14 nicklas 416       html += '<option selected value="">unknown';
2801 13 Oct 14 nicklas 417       html += '<option value="Primary">Primary';
2801 13 Oct 14 nicklas 418       html += '<option value="LymphnodeRegional">LymphnodeRegional';        
2801 13 Oct 14 nicklas 419       html += '<option value="MetastasisDistant">MetastasisDistant';
2801 13 Oct 14 nicklas 420       html += '<option value="RecurrenceLocal">RecurrenceLocal';
2801 13 Oct 14 nicklas 421       html += '<option value="RecurrenceRegional">RecurrenceRegional';
2801 13 Oct 14 nicklas 422       html += '<option value="Normal">Normal';
2801 13 Oct 14 nicklas 423       html += '<option value="Uncertain">Uncertain';
2801 13 Oct 14 nicklas 424       html += '</select>';
2801 13 Oct 14 nicklas 425       html += '</td>';
2801 13 Oct 14 nicklas 426       html += '<td class="status" id="specimenType.'+i+'.status"></td>';
2801 13 Oct 14 nicklas 427       html += '<td class="help"><span id="specimenType.'+i+'.message" class="message"></span></td>';    
2801 13 Oct 14 nicklas 428       html += '</tr>';
2801 13 Oct 14 nicklas 429       
2677 17 Sep 14 nicklas 430       html += '<tr>';
5333 28 Mar 19 nicklas 431       html += '<td class="subprompt">Sample processing</td>';
5333 28 Mar 19 nicklas 432       html += '<td class="input">';
5333 28 Mar 19 nicklas 433       html += '<label><input type="radio" name="processing.'+i+'" value="1" id="continue.'+i+'" '+(defaultPaused?'':'checked')+'>Continue</label>';
5333 28 Mar 19 nicklas 434       html += '<label><input type="radio" name="processing.'+i+'" value="0" id="pause.'+i+'" '+(defaultPaused?'checked':'')+'>Pause</label>';
5333 28 Mar 19 nicklas 435       html += '</td>';
5333 28 Mar 19 nicklas 436       html += '<td class="status"></td>';
5333 28 Mar 19 nicklas 437       html += '<td class="help">Select if the specimen should be partitioned and extracted or if it should be paused until later.</td>';
5333 28 Mar 19 nicklas 438       html += '</tr>';
5333 28 Mar 19 nicklas 439
5333 28 Mar 19 nicklas 440       html += '<tr class="storage-box">';
2677 17 Sep 14 nicklas 441       html += '<td class="subprompt">Box</td>';
2677 17 Sep 14 nicklas 442       html += '<td class="input">';
2677 17 Sep 14 nicklas 443       html += '<input type="text" name="box.'+i+'" id="box.'+i+'" style="width: 12em;" maxlength="12"></td>';
2677 17 Sep 14 nicklas 444       html += '<td class="status" id="box.'+i+'.status"></td>';
5333 28 Mar 19 nicklas 445       html += '<td class="help"><span id="box.'+i+'.message" class="message"></span>Box-number where the specimen tube should be stored.</td>';    
2677 17 Sep 14 nicklas 446       html += '</tr>';
2677 17 Sep 14 nicklas 447       
5333 28 Mar 19 nicklas 448       html += '<tr class="storage-box">';
2677 17 Sep 14 nicklas 449       html += '<td class="subprompt">Row</td>';
2677 17 Sep 14 nicklas 450       html += '<td class="input">';
2677 17 Sep 14 nicklas 451       html += '<input type="text" name="row.'+i+'" id="row.'+i+'" style="text-transform:uppercase; width: 3em;" maxlength="2">';
2677 17 Sep 14 nicklas 452       html += '&nbsp;Column<input type="text" name="column.'+i+'" id="column.'+i+'" style="width: 3em;" maxlength="2">';
2677 17 Sep 14 nicklas 453       html += '</td>';
2677 17 Sep 14 nicklas 454       html += '<td class="status" id="position.'+i+'.status"></td>';
2677 17 Sep 14 nicklas 455       html += '<td class="help"><span id="position.'+i+'.message" class="message"></span></td>';    
2677 17 Sep 14 nicklas 456       html += '</tr>';
2677 17 Sep 14 nicklas 457
2677 17 Sep 14 nicklas 458       html += '<tr class="align-top">';
2677 17 Sep 14 nicklas 459       html += '<td class="subprompt">Operator delivery comment</td>';
2677 17 Sep 14 nicklas 460       html += '<td class="input"><textarea rows="3" name="comment.'+i+'" id="comment.'+i+'"></textarea></td>';
2677 17 Sep 14 nicklas 461       html += '<td class="status" id="comment.'+i+'.status"></td>';
2801 13 Oct 14 nicklas 462       html += '<td class="help"><span id="comment.'+i+'.message" class="message"></span>In this field, enter information specific for specimen tube ' +tubeNo+'.</td>';    
2677 17 Sep 14 nicklas 463       html += '</tr>';
3602 16 Nov 15 nicklas 464       
3602 16 Nov 15 nicklas 465       html += '</tbody>';
2677 17 Sep 14 nicklas 466     }
2677 17 Sep 14 nicklas 467     Doc.element('specimen-tubes').innerHTML = html;
2677 17 Sep 14 nicklas 468
5333 28 Mar 19 nicklas 469     for (var i = 0; i < nofTubes; i++)
5333 28 Mar 19 nicklas 470     {
5333 28 Mar 19 nicklas 471       // Move focus to next field
5333 28 Mar 19 nicklas 472       Events.addEventHandler('specimenType.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'box.'+i });
5333 28 Mar 19 nicklas 473       Events.addEventHandler('box.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'row.'+i });
5333 28 Mar 19 nicklas 474       Events.addEventHandler('row.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'column.'+i });
5333 28 Mar 19 nicklas 475       Events.addEventHandler('column.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'comment.'+i });
5333 28 Mar 19 nicklas 476       
5333 28 Mar 19 nicklas 477       // Form validation
5333 28 Mar 19 nicklas 478       Events.addEventHandler('column.'+i, 'keypress', Events.integerOnly);
5333 28 Mar 19 nicklas 479       Events.addEventHandler('box.'+i, 'change', streg.wellOnChange, { 'index': i });
5333 28 Mar 19 nicklas 480       Events.addEventHandler('row.'+i, 'change', streg.wellOnChange, { 'index': i });
5333 28 Mar 19 nicklas 481       Events.addEventHandler('column.'+i, 'change', streg.wellOnChange, { 'index': i });
5333 28 Mar 19 nicklas 482       Events.addEventHandler('box.'+i, 'keyup', streg.boxOnKeyUp);
5333 28 Mar 19 nicklas 483       
5333 28 Mar 19 nicklas 484       // Yellow label + pause
5333 28 Mar 19 nicklas 485       Events.addEventHandler('yellowLabel.'+i, 'change', streg.yellowLabelOnChange, { 'index': i });
5333 28 Mar 19 nicklas 486       Events.addEventHandler('continue.'+i, 'change', streg.processingOnChange, { 'index': i });
5333 28 Mar 19 nicklas 487       Events.addEventHandler('pause.'+i, 'change', streg.processingOnChange, { 'index': i });
5333 28 Mar 19 nicklas 488     }
5333 28 Mar 19 nicklas 489     
2677 17 Sep 14 nicklas 490     Wizard.setCurrentStep(3);
2677 17 Sep 14 nicklas 491     Doc.show('goregister');
2677 17 Sep 14 nicklas 492     Doc.show('gocancel');
2801 13 Oct 14 nicklas 493     frm['specimenType.0'].focus();
2677 17 Sep 14 nicklas 494     
2677 17 Sep 14 nicklas 495     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
5335 28 Mar 19 nicklas 496     url += '&cmd=FindStoragePositions&includePausePositions=1';  
2677 17 Sep 14 nicklas 497     url += '&nofTubes='+frm.nofTubes.value;
2677 17 Sep 14 nicklas 498     
2677 17 Sep 14 nicklas 499     Wizard.showLoadingAnimation('Looking for empty box positions...');
2677 17 Sep 14 nicklas 500     Wizard.asyncJsonRequest(url, streg.storagePositionsLoaded);
2677 17 Sep 14 nicklas 501   }
2677 17 Sep 14 nicklas 502   
2677 17 Sep 14 nicklas 503   streg.storagePositionsLoaded = function(response)
2677 17 Sep 14 nicklas 504   {
5333 28 Mar 19 nicklas 505     freeWells = response.wells;
5333 28 Mar 19 nicklas 506     freePausedWells = response.pausedWells;
5333 28 Mar 19 nicklas 507     streg.setDefaultStoragePositions();
5333 28 Mar 19 nicklas 508   }
5333 28 Mar 19 nicklas 509   
5333 28 Mar 19 nicklas 510   streg.setDefaultStoragePositions = function()
5333 28 Mar 19 nicklas 511   {
2677 17 Sep 14 nicklas 512     var frm = document.forms['reggie'];
2677 17 Sep 14 nicklas 513     var nofTubes = parseInt(frm.nofTubes.value);
5333 28 Mar 19 nicklas 514     
5333 28 Mar 19 nicklas 515     var wellNo = 0;
5333 28 Mar 19 nicklas 516     var pausedWellNo = 0;
5333 28 Mar 19 nicklas 517     for (var tubeNo = 0; tubeNo < nofTubes; tubeNo++)
2677 17 Sep 14 nicklas 518     {
5333 28 Mar 19 nicklas 519       var well = Doc.element('pause.'+tubeNo).checked ? freePausedWells[pausedWellNo++] : freeWells[wellNo++];
5333 28 Mar 19 nicklas 520       frm['box.'+tubeNo].value = well.bioPlate.name;
5333 28 Mar 19 nicklas 521       frm['row.'+tubeNo].value = Reggie.wellToAlpha(well.row);
5333 28 Mar 19 nicklas 522       frm['column.'+tubeNo].value = well.column+1;
5333 28 Mar 19 nicklas 523       wellIsValid[tubeNo] = true;
5333 28 Mar 19 nicklas 524       Wizard.setInputStatus('position.'+tubeNo, 'valid');
5333 28 Mar 19 nicklas 525       Wizard.setInputStatus('box.'+tubeNo, 'valid');
2677 17 Sep 14 nicklas 526     }
2677 17 Sep 14 nicklas 527   }
2677 17 Sep 14 nicklas 528   
3602 16 Nov 15 nicklas 529   // Update class on specimen section
3602 16 Nov 15 nicklas 530   streg.yellowLabelOnChange = function(event)
3602 16 Nov 15 nicklas 531   {
3602 16 Nov 15 nicklas 532     var index = Data.int(event.currentTarget, 'index');
3602 16 Nov 15 nicklas 533     Doc.addOrRemoveClass('specimenSection.'+index, 'yellow-label', event.currentTarget.checked);
3602 16 Nov 15 nicklas 534   }
3602 16 Nov 15 nicklas 535   
5333 28 Mar 19 nicklas 536   streg.processingOnChange = function(event)
5333 28 Mar 19 nicklas 537   {
5333 28 Mar 19 nicklas 538     var index = Data.int(event.currentTarget, 'index');
5333 28 Mar 19 nicklas 539     Doc.addOrRemoveClass('specimenSection.'+index, 'pause-specimen', Doc.element('pause.'+index).checked);
5333 28 Mar 19 nicklas 540     streg.setDefaultStoragePositions();
5333 28 Mar 19 nicklas 541   }
5333 28 Mar 19 nicklas 542   
2677 17 Sep 14 nicklas 543   streg.boxOnKeyUp = function(event)
2677 17 Sep 14 nicklas 544   {
2677 17 Sep 14 nicklas 545     var frm = document.forms['reggie'];
2677 17 Sep 14 nicklas 546     
2677 17 Sep 14 nicklas 547     var index = Data.int(event.currentTarget, 'index');
2677 17 Sep 14 nicklas 548
2677 17 Sep 14 nicklas 549     var box = frm['box.'+index].value;
5333 28 Mar 19 nicklas 550     var paused = Doc.element('pause.'+index).checked;
5333 28 Mar 19 nicklas 551     var prefix = paused ? 'PSp' : 'Sp';
5333 28 Mar 19 nicklas 552     if (box.indexOf(prefix) != 0)
2677 17 Sep 14 nicklas 553     {
5333 28 Mar 19 nicklas 554       frm['box.'+index].value = prefix+box;
2677 17 Sep 14 nicklas 555     }
2677 17 Sep 14 nicklas 556   }
2677 17 Sep 14 nicklas 557
2677 17 Sep 14 nicklas 558   
2677 17 Sep 14 nicklas 559   streg.wellOnChange = function(event)
2677 17 Sep 14 nicklas 560   {
2677 17 Sep 14 nicklas 561     var frm = document.forms['reggie'];
2677 17 Sep 14 nicklas 562     var target = event.currentTarget;
2677 17 Sep 14 nicklas 563
2677 17 Sep 14 nicklas 564     var index = Data.int(target, 'index');
2677 17 Sep 14 nicklas 565     var box = frm['box.'+index].value;
2677 17 Sep 14 nicklas 566     var row = frm['row.'+index].value;
2677 17 Sep 14 nicklas 567     var column = frm['column.'+index].value;
5333 28 Mar 19 nicklas 568     var paused = Doc.element('pause.'+index).checked;
2677 17 Sep 14 nicklas 569     
2677 17 Sep 14 nicklas 570     wellIsValid[index] = false;
2677 17 Sep 14 nicklas 571     Wizard.setInputStatus('box.'+index);
2677 17 Sep 14 nicklas 572     Wizard.setInputStatus('position.'+index);
2677 17 Sep 14 nicklas 573     
2677 17 Sep 14 nicklas 574     if (box == '') 
2677 17 Sep 14 nicklas 575     {
2677 17 Sep 14 nicklas 576       Wizard.setInputStatus('box.'+index, 'invalid', 'Missing box');
2677 17 Sep 14 nicklas 577       return;
2677 17 Sep 14 nicklas 578     }
2677 17 Sep 14 nicklas 579     
2677 17 Sep 14 nicklas 580     if (row == '')
2677 17 Sep 14 nicklas 581     {
2677 17 Sep 14 nicklas 582       Wizard.setInputStatus('position.'+index, 'invalid', 'Missing row');
2677 17 Sep 14 nicklas 583       return;
2677 17 Sep 14 nicklas 584     }
2677 17 Sep 14 nicklas 585
2677 17 Sep 14 nicklas 586     if (column == '')
2677 17 Sep 14 nicklas 587     {
2677 17 Sep 14 nicklas 588       Wizard.setInputStatus('position.'+index, 'invalid', 'Missing column');
2677 17 Sep 14 nicklas 589       return;
2677 17 Sep 14 nicklas 590     }
2677 17 Sep 14 nicklas 591     
2677 17 Sep 14 nicklas 592     // Check for duplicates
2677 17 Sep 14 nicklas 593     var nofTubes = parseInt(frm.nofTubes.value);
2677 17 Sep 14 nicklas 594     for (var i=0; i < nofTubes; i++)
2677 17 Sep 14 nicklas 595     {    
2677 17 Sep 14 nicklas 596       if (i != index)
2677 17 Sep 14 nicklas 597       {
2677 17 Sep 14 nicklas 598         if (box == frm.elements['box.'+i].value && row == frm['row.'+i].value && column == frm['column.'+i].value)
2677 17 Sep 14 nicklas 599         {
2677 17 Sep 14 nicklas 600           Wizard.setInputStatus('position.'+index, 'invalid', 'The position is already used once in this wizard');        
2677 17 Sep 14 nicklas 601           return;
2677 17 Sep 14 nicklas 602         }
2677 17 Sep 14 nicklas 603       }
2677 17 Sep 14 nicklas 604     }
2677 17 Sep 14 nicklas 605
2677 17 Sep 14 nicklas 606     Wizard.setInputStatus('position.'+index, 'checking', 'Checking...');
2677 17 Sep 14 nicklas 607     
2677 17 Sep 14 nicklas 608     // Seems to be ok -- check if used by another sample
2677 17 Sep 14 nicklas 609     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
2677 17 Sep 14 nicklas 610     url += '&cmd=ValidateWell';
2677 17 Sep 14 nicklas 611     url += '&box=' + encodeURIComponent(box);  
2677 17 Sep 14 nicklas 612     url += '&row=' + encodeURIComponent(row);
2677 17 Sep 14 nicklas 613     url += '&column=' + encodeURIComponent(column);
5333 28 Mar 19 nicklas 614     url += '&paused='+(paused ? 1 : 0)
2677 17 Sep 14 nicklas 615     
2677 17 Sep 14 nicklas 616     Wizard.asyncJsonRequest(url, function(response) { streg.onBoxValidated(response, index) } );
2677 17 Sep 14 nicklas 617   }
2677 17 Sep 14 nicklas 618   
2677 17 Sep 14 nicklas 619   streg.onBoxValidated = function(response, index)
2677 17 Sep 14 nicklas 620   {
2677 17 Sep 14 nicklas 621     Wizard.setInputStatus('position.'+index);
2677 17 Sep 14 nicklas 622     if (response.message)
2677 17 Sep 14 nicklas 623     {
2677 17 Sep 14 nicklas 624       Wizard.setInputStatus(response.box ? 'box.'+index : 'position.'+index, 'invalid', Strings.encodeTags(response.message));
2677 17 Sep 14 nicklas 625       return;
2677 17 Sep 14 nicklas 626     }
2677 17 Sep 14 nicklas 627     
2677 17 Sep 14 nicklas 628     wellIsValid[index] = true;
2677 17 Sep 14 nicklas 629     Wizard.setInputStatus('box.'+index, 'valid');
2677 17 Sep 14 nicklas 630     Wizard.setInputStatus('position.'+index, 'valid');
2677 17 Sep 14 nicklas 631   }
2677 17 Sep 14 nicklas 632
2677 17 Sep 14 nicklas 633   
2677 17 Sep 14 nicklas 634   streg.validateStep3 = function(event)
2677 17 Sep 14 nicklas 635   {
2677 17 Sep 14 nicklas 636     var valid = false;
2677 17 Sep 14 nicklas 637
2677 17 Sep 14 nicklas 638     for (var i = 0; i < wellIsValid.length; i++)
2677 17 Sep 14 nicklas 639     {
2677 17 Sep 14 nicklas 640       if (!wellIsValid[i])
2677 17 Sep 14 nicklas 641       {
2677 17 Sep 14 nicklas 642         event.preventDefault();
2677 17 Sep 14 nicklas 643         return;
2677 17 Sep 14 nicklas 644       }
2677 17 Sep 14 nicklas 645     }
2677 17 Sep 14 nicklas 646   }
2677 17 Sep 14 nicklas 647
2677 17 Sep 14 nicklas 648   
2677 17 Sep 14 nicklas 649   streg.submit = function()
2677 17 Sep 14 nicklas 650   {
2677 17 Sep 14 nicklas 651     var frm = document.forms['reggie'];
2677 17 Sep 14 nicklas 652     
2677 17 Sep 14 nicklas 653     caseInfo.laterality = Forms.getCheckedRadio(frm.laterality).value;
2677 17 Sep 14 nicklas 654     caseInfo.samplingDate = Strings.trim(frm.samplingDate.value + ' ' + frm.samplingTime.value);
2677 17 Sep 14 nicklas 655     caseInfo.rnaLaterDate = Strings.trim(frm.rnaLaterDate.value + ' ' + frm.rnaLaterTime.value);
2677 17 Sep 14 nicklas 656     caseInfo.otherPathNote = frm.otherPathNote.value;
2677 17 Sep 14 nicklas 657     caseInfo.arrivalDate = Strings.trim(frm.arrivalDate.value);
2677 17 Sep 14 nicklas 658     
2677 17 Sep 14 nicklas 659     var nofTubes = parseInt(frm.nofTubes.value);
2677 17 Sep 14 nicklas 660     caseInfo.specimen = [];
2677 17 Sep 14 nicklas 661     for (var i = 0; i < nofTubes; i++)
2677 17 Sep 14 nicklas 662     {
2677 17 Sep 14 nicklas 663       var specimenTube ={};
2677 17 Sep 14 nicklas 664       specimenTube.name = caseInfo.originalName+'.'+(i+caseInfo.specimenFirstIndex);
5333 28 Mar 19 nicklas 665       specimenTube.paused = Doc.element('pause.'+i).checked;
2677 17 Sep 14 nicklas 666
2677 17 Sep 14 nicklas 667       specimenTube.box = frm['box.'+i].value;
2677 17 Sep 14 nicklas 668       specimenTube.row = frm['row.'+i].value;
2677 17 Sep 14 nicklas 669       specimenTube.column = frm['column.'+i].value;
2677 17 Sep 14 nicklas 670       specimenTube.comment = frm['comment.'+i].value;
2801 13 Oct 14 nicklas 671       specimenTube.specimenType = frm['specimenType.'+i].value;
3602 16 Nov 15 nicklas 672       specimenTube.yellowLabel = frm['yellowLabel.'+i].checked;
2677 17 Sep 14 nicklas 673       specimenTube.biopsyType = frm.biopsyType.value;
2677 17 Sep 14 nicklas 674       caseInfo.specimen[i] = specimenTube;
2677 17 Sep 14 nicklas 675     }
2677 17 Sep 14 nicklas 676
2677 17 Sep 14 nicklas 677     var submitInfo = {};
2677 17 Sep 14 nicklas 678     submitInfo.caseInfo = caseInfo;
2677 17 Sep 14 nicklas 679
2677 17 Sep 14 nicklas 680     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
2677 17 Sep 14 nicklas 681     url += '&cmd=CreateSpecimenTubes';
2677 17 Sep 14 nicklas 682     Wizard.showLoadingAnimation('Performing registration...');
2677 17 Sep 14 nicklas 683     Wizard.asyncJsonRequest(url, streg.submissionResults, 'POST', JSON.stringify(submitInfo));
2677 17 Sep 14 nicklas 684   }
2677 17 Sep 14 nicklas 685   
2677 17 Sep 14 nicklas 686   streg.submissionResults = function(response)
2677 17 Sep 14 nicklas 687   {
2677 17 Sep 14 nicklas 688     Wizard.showFinalMessage(response.messages);
2677 17 Sep 14 nicklas 689     Doc.show('gostop');
2677 17 Sep 14 nicklas 690     Doc.show('gonext-message');
5333 28 Mar 19 nicklas 691     restartAt = (new Date()).getTime() + 4000;
2677 17 Sep 14 nicklas 692     restartTimer = setInterval(streg.countDownToRestart, 200);
2677 17 Sep 14 nicklas 693   }
2677 17 Sep 14 nicklas 694
2677 17 Sep 14 nicklas 695   streg.countDownToRestart = function()
2677 17 Sep 14 nicklas 696   {
2677 17 Sep 14 nicklas 697     var time = restartAt - (new Date()).getTime();
2677 17 Sep 14 nicklas 698     if (time < 0)
2677 17 Sep 14 nicklas 699     {
5333 28 Mar 19 nicklas 700       clearTimeout(restartTimer);
2677 17 Sep 14 nicklas 701       Wizard.restartWizard();
2677 17 Sep 14 nicklas 702     }
2677 17 Sep 14 nicklas 703     else
2677 17 Sep 14 nicklas 704     {
2677 17 Sep 14 nicklas 705       Doc.element('gonext-message').innerHTML = '<i>Wizard will restart automatically in ' + Math.ceil(time/1000) + ' seconds...</i>';
2677 17 Sep 14 nicklas 706     }
2677 17 Sep 14 nicklas 707   }
2677 17 Sep 14 nicklas 708   
2677 17 Sep 14 nicklas 709   streg.stopAutoRestart = function()
2677 17 Sep 14 nicklas 710   {
2677 17 Sep 14 nicklas 711     clearTimeout(restartTimer);
2677 17 Sep 14 nicklas 712     Doc.hide('gonext-message');
2677 17 Sep 14 nicklas 713     Doc.hide('gostop');
5333 28 Mar 19 nicklas 714     Doc.show('gorestart');
2677 17 Sep 14 nicklas 715   }
2677 17 Sep 14 nicklas 716
2677 17 Sep 14 nicklas 717   
2677 17 Sep 14 nicklas 718   return streg;
2677 17 Sep 14 nicklas 719 }();
2677 17 Sep 14 nicklas 720
2677 17 Sep 14 nicklas 721 Doc.onLoad(SpecimenTubeReg.initPage);
2677 17 Sep 14 nicklas 722