extensions/net.sf.basedb.meludi/trunk/resources/sampleproc/specimentube_alt_rec.js

Code
Comments
Other
Rev Date Author Line
4733 05 Apr 18 olle 1 var SpecimenTubeReg = function()
4733 05 Apr 18 olle 2 {
4733 05 Apr 18 olle 3   var streg = {};
4733 05 Apr 18 olle 4   var debug = 0;
4733 05 Apr 18 olle 5   var myPermissions = {};
4733 05 Apr 18 olle 6   
4733 05 Apr 18 olle 7   var caseInfo;
4733 05 Apr 18 olle 8   
4733 05 Apr 18 olle 9   var sampleItemPrefix = '';
4733 05 Apr 18 olle 10   var sampleItemNumDigits = 5;
4733 05 Apr 18 olle 11   var nofTubesIsValid = false;
4733 05 Apr 18 olle 12   var samplingDateIsValid = true;
4733 05 Apr 18 olle 13   var viableTumourCellsPercentIsValid = true;
4733 05 Apr 18 olle 14   var usesSitePrefix = false;
4733 05 Apr 18 olle 15
4733 05 Apr 18 olle 16   // Well validation variable for input specimen, DNA, RNA
4733 05 Apr 18 olle 17   var wellIsValid = [];
4733 05 Apr 18 olle 18   // Well validation variables for extracts from specimen
4733 05 Apr 18 olle 19   var dnaWellIsValid = [];
4733 05 Apr 18 olle 20   var rnaWellIsValid = [];
4733 05 Apr 18 olle 21   
4733 05 Apr 18 olle 22   var restartTimer;
4733 05 Apr 18 olle 23   var restartAt;
4733 05 Apr 18 olle 24   
4733 05 Apr 18 olle 25   // Page initialization
4733 05 Apr 18 olle 26   streg.initPage = function()
4733 05 Apr 18 olle 27   {
4733 05 Apr 18 olle 28     // Step 1
4733 05 Apr 18 olle 29     Events.addEventHandler('step-1', 'wizard-validate', streg.validateStep1);
4733 05 Apr 18 olle 30     Events.addEventHandler('caseName', 'keypress', Wizard.goNextOnTabOrEnter);
4733 05 Apr 18 olle 31     
4733 05 Apr 18 olle 32     // Step 2
4733 05 Apr 18 olle 33     Events.addEventHandler('step-2', 'wizard-initialize', streg.initializeStep2);
4733 05 Apr 18 olle 34     Events.addEventHandler('step-2', 'wizard-validate', streg.validateStep2);
4733 05 Apr 18 olle 35     Events.addEventHandler('pad', 'blur', streg.padOnChange);
4733 05 Apr 18 olle 36     Events.addEventHandler('nofTubes', 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 37     Events.addEventHandler('nofTubes', 'blur', streg.nofTubesOnChange);
4733 05 Apr 18 olle 38     Events.addEventHandler('arrivalDate', 'blur', Wizard.validateDate);
4733 05 Apr 18 olle 39     Events.addEventHandler('samplingDate', 'blur', streg.samplingDateOnChange);
4733 05 Apr 18 olle 40     Events.addEventHandler('projectFocus', 'change', streg.projectFocusOnChange);
4733 05 Apr 18 olle 41     Events.addEventHandler('site', 'change', streg.siteOnChange);
4733 05 Apr 18 olle 42     Events.addEventHandler('specimenType', 'change', streg.specimenTypeOnChange);
4733 05 Apr 18 olle 43     Events.addEventHandler('viableTumourCellsPercent', 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 44     Events.addEventHandler('viableTumourCellsPercent', 'blur', streg.viableTumourCellsPercentOnChange);
4733 05 Apr 18 olle 45     Events.addEventHandler('otherPathNote', 'keypress', Wizard.goNextOnTab);
4733 05 Apr 18 olle 46     Buttons.addClickHandler('selectAllMutationAnalysis', streg.mutationAnalysisSelectAll);
4733 05 Apr 18 olle 47
4733 05 Apr 18 olle 48     // Step 3
4733 05 Apr 18 olle 49     Events.addEventHandler('step-3', 'wizard-initialize', streg.initializeStep3);
4733 05 Apr 18 olle 50     Events.addEventHandler('step-3', 'wizard-validate', streg.validateStep3);
4733 05 Apr 18 olle 51     
4733 05 Apr 18 olle 52     // Navigation
4733 05 Apr 18 olle 53     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
4733 05 Apr 18 olle 54     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
4733 05 Apr 18 olle 55     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
4733 05 Apr 18 olle 56     Buttons.addClickHandler('goregister', Wizard.goRegister);
4733 05 Apr 18 olle 57     Buttons.addClickHandler('gostop', streg.stopAutoRestart);
4733 05 Apr 18 olle 58     
4733 05 Apr 18 olle 59     // Final registration
4733 05 Apr 18 olle 60     Events.addEventHandler('wizard', 'wizard-submit', streg.submit);
4733 05 Apr 18 olle 61
4733 05 Apr 18 olle 62     // Load permissions
4733 05 Apr 18 olle 63     streg.initPermissions();
4733 05 Apr 18 olle 64     // Load configuration
4733 05 Apr 18 olle 65     streg.loadConfiguration();
4733 05 Apr 18 olle 66   }
4733 05 Apr 18 olle 67   
4733 05 Apr 18 olle 68   streg.initPermissions = function()
4733 05 Apr 18 olle 69   {
4733 05 Apr 18 olle 70     // Get permission information
4733 05 Apr 18 olle 71     var url = '../Install.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 72     url += '&cmd=GetPermissions';
4733 05 Apr 18 olle 73     var request = Ajax.getXmlHttpRequest();
4733 05 Apr 18 olle 74     request.open("GET", url, true);
4733 05 Apr 18 olle 75     Ajax.setReadyStateHandler(request, streg.onPermissionsLoaded, streg.onPermissionsLoaded);
4733 05 Apr 18 olle 76     request.send(null);
4733 05 Apr 18 olle 77   }
4733 05 Apr 18 olle 78   
4733 05 Apr 18 olle 79   // Callback when permission information is ready
4733 05 Apr 18 olle 80   streg.onPermissionsLoaded = function(request)
4733 05 Apr 18 olle 81   {
4733 05 Apr 18 olle 82     if (debug) App.debug(Strings.encodeTags(request.responseText));
4733 05 Apr 18 olle 83     var response;
4733 05 Apr 18 olle 84     var error = false;
4733 05 Apr 18 olle 85     try
4733 05 Apr 18 olle 86     {
4733 05 Apr 18 olle 87       response = JSON.parse(request.responseText);
4733 05 Apr 18 olle 88       if (response.status != 'ok')
4733 05 Apr 18 olle 89       {
4733 05 Apr 18 olle 90         error = response.message || response.stacktrace || 'Unexpected error';
4733 05 Apr 18 olle 91       }
4733 05 Apr 18 olle 92     }
4733 05 Apr 18 olle 93     catch (ex)
4733 05 Apr 18 olle 94     {
4733 05 Apr 18 olle 95       error = ex;
4733 05 Apr 18 olle 96     }
4733 05 Apr 18 olle 97     
4733 05 Apr 18 olle 98     if (error)
4733 05 Apr 18 olle 99     {
4733 05 Apr 18 olle 100       alert(error);
4733 05 Apr 18 olle 101       return;
4733 05 Apr 18 olle 102     }
4733 05 Apr 18 olle 103     
4733 05 Apr 18 olle 104     myPermissions = response.permissions;
4733 05 Apr 18 olle 105     //var isAdmin = myPermissions['Administrator'] == 1;
4733 05 Apr 18 olle 106     //var noProjectIsActive = !App.getActiveProjectId();
4733 05 Apr 18 olle 107   }
4733 05 Apr 18 olle 108
4733 05 Apr 18 olle 109   streg.loadConfiguration = function()
4733 05 Apr 18 olle 110   {
4733 05 Apr 18 olle 111     var url = '../Session.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 112     url += '&cmd=GetConfiguration'
4733 05 Apr 18 olle 113     var request = Ajax.getXmlHttpRequest();
4733 05 Apr 18 olle 114     request.open("GET", url, true);
4733 05 Apr 18 olle 115     Ajax.setReadyStateHandler(request, streg.onConfiguration, streg.onConfiguration);
4733 05 Apr 18 olle 116     request.send(null);
4733 05 Apr 18 olle 117   }
4733 05 Apr 18 olle 118   
4733 05 Apr 18 olle 119   streg.onConfiguration = function(request)
4733 05 Apr 18 olle 120   {
4733 05 Apr 18 olle 121     var frm = document.forms['meludi'];  
4733 05 Apr 18 olle 122
4733 05 Apr 18 olle 123     if (debug)
4733 05 Apr 18 olle 124     {
4733 05 Apr 18 olle 125       App.debug(Strings.encodeTags(request.responseText));
4733 05 Apr 18 olle 126     }
4733 05 Apr 18 olle 127     
4733 05 Apr 18 olle 128     var response;
4733 05 Apr 18 olle 129     var error = false;
4733 05 Apr 18 olle 130     try
4733 05 Apr 18 olle 131     {
4733 05 Apr 18 olle 132       response = JSON.parse(request.responseText);
4733 05 Apr 18 olle 133       if (response.status != 'ok')
4733 05 Apr 18 olle 134       {
4733 05 Apr 18 olle 135         error = response.message || response.stacktrace || 'Unexpected error';
4733 05 Apr 18 olle 136       }
4733 05 Apr 18 olle 137     }
4733 05 Apr 18 olle 138     catch (ex)
4733 05 Apr 18 olle 139     {
4733 05 Apr 18 olle 140       error = ex;
4733 05 Apr 18 olle 141     }
4733 05 Apr 18 olle 142     if (error) App.debug(error);
4733 05 Apr 18 olle 143
4733 05 Apr 18 olle 144     // Get configuration result    
4733 05 Apr 18 olle 145     var conf = response.configuration;
4733 05 Apr 18 olle 146     // Check for uses site prefix flag
4733 05 Apr 18 olle 147     usesSitePrefix = conf.usesSitePrefix;
4733 05 Apr 18 olle 148     // Check for project focus default
4733 05 Apr 18 olle 149     var projectFocusDefault = conf.projectFocusDefault;
4733 05 Apr 18 olle 150     if (projectFocusDefault != null)
4733 05 Apr 18 olle 151     {
4733 05 Apr 18 olle 152       frm.projectFocus.value = projectFocusDefault;
4733 05 Apr 18 olle 153       streg.projectFocusOnChange();
4733 05 Apr 18 olle 154     }
4733 05 Apr 18 olle 155     // Check for specimen type default
4733 05 Apr 18 olle 156     var specimenTypeDefault = conf.specimenTypeDefault;
4733 05 Apr 18 olle 157     if (specimenTypeDefault != null)
4733 05 Apr 18 olle 158     {
4733 05 Apr 18 olle 159       frm.specimenType.value = specimenTypeDefault;
4733 05 Apr 18 olle 160     }
4733 05 Apr 18 olle 161     // Check for specimen input type default
4733 05 Apr 18 olle 162     var specimenInputTypeDefault = conf.specimenInputTypeDefault;
4733 05 Apr 18 olle 163     if (specimenInputTypeDefault != null)
4733 05 Apr 18 olle 164     {
4733 05 Apr 18 olle 165       frm.specimenInputType.value = specimenInputTypeDefault;
4733 05 Apr 18 olle 166     }
4733 05 Apr 18 olle 167     // Check for extracts from first specimen only default
4733 05 Apr 18 olle 168     var extractsFromFirstSpecimenOnlyDefault = conf.extractsFromFirstSpecimenOnlyDefault;
4733 05 Apr 18 olle 169     if (extractsFromFirstSpecimenOnlyDefault != null)
4733 05 Apr 18 olle 170     {
4733 05 Apr 18 olle 171       frm.extractsFromFirstSpecimenOnlyCB.checked = extractsFromFirstSpecimenOnlyDefault;
4733 05 Apr 18 olle 172     }
4733 05 Apr 18 olle 173
4733 05 Apr 18 olle 174     // Continue with initializing info for case
4733 05 Apr 18 olle 175     var url = '../LabelGeneration.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 176     url += '&cmd=CountCases';
4733 05 Apr 18 olle 177     Wizard.showLoadingAnimation('Loading cases...');
4733 05 Apr 18 olle 178     Wizard.asyncJsonRequest(url, streg.caseInfoLoadedStep1);
4733 05 Apr 18 olle 179   }
4733 05 Apr 18 olle 180
4733 05 Apr 18 olle 181   streg.caseInfoLoadedStep1 = function(response)
4733 05 Apr 18 olle 182   {
4733 05 Apr 18 olle 183     var frm = document.forms['meludi'];  
4733 05 Apr 18 olle 184
4733 05 Apr 18 olle 185     // Disable PAD/CL input field if not Administrator or PatientCurator
4733 05 Apr 18 olle 186     var isAdmin = myPermissions['Administrator'] == 1;
4733 05 Apr 18 olle 187     var isPatCur = myPermissions['PatientCurator'] == 1;
4733 05 Apr 18 olle 188     if (!isAdmin && !isPatCur)
4733 05 Apr 18 olle 189     {
4733 05 Apr 18 olle 190       frm.pad.disabled = true;
4733 05 Apr 18 olle 191     }
4733 05 Apr 18 olle 192
4733 05 Apr 18 olle 193     sampleItemPrefix = response.sampleItemPrefix;
4733 05 Apr 18 olle 194     sampleItemNumDigits = response.sampleItemNumDigits;
4733 05 Apr 18 olle 195     var nofCases = response.count;
4733 05 Apr 18 olle 196     if (nofCases == null)
4733 05 Apr 18 olle 197     {
4733 05 Apr 18 olle 198       nofCases = 0;
4733 05 Apr 18 olle 199     }
4733 05 Apr 18 olle 200     var startNum = nofCases + 1;
4733 05 Apr 18 olle 201     // Pad number with leading zeros to get right number of digits
4733 05 Apr 18 olle 202     startNum = String('0000000000' + startNum).slice(-sampleItemNumDigits);
4733 05 Apr 18 olle 203     var startCase = sampleItemPrefix + startNum;
4733 05 Apr 18 olle 204     if (usesSitePrefix != null && usesSitePrefix)
4733 05 Apr 18 olle 205     {
4733 05 Apr 18 olle 206       startCase = '';
4733 05 Apr 18 olle 207     }
4733 05 Apr 18 olle 208     frm.caseName.value = startCase;
4733 05 Apr 18 olle 209     Doc.element('caseNameText').innerHTML = 'The case name (barcode) associated with this specimen tube ("' + sampleItemPrefix + '" + ' + sampleItemNumDigits + ' digits).';
4733 05 Apr 18 olle 210     
4733 05 Apr 18 olle 211     Doc.show('step-1');
4733 05 Apr 18 olle 212     Doc.show('gonext');
4733 05 Apr 18 olle 213   }
4733 05 Apr 18 olle 214
4733 05 Apr 18 olle 215   streg.validateStep1 = function(event)
4733 05 Apr 18 olle 216   {
4733 05 Apr 18 olle 217     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 218     
4733 05 Apr 18 olle 219     var caseName = frm.caseName.value;
4733 05 Apr 18 olle 220     var caseIsValid = false;
4733 05 Apr 18 olle 221     Wizard.setInputStatus('caseName');
4733 05 Apr 18 olle 222     if (caseName == '')
4733 05 Apr 18 olle 223     {
4733 05 Apr 18 olle 224       Wizard.setInputStatus('caseName', 'invalid', 'Missing');
4733 05 Apr 18 olle 225       frm.caseName.focus();
4733 05 Apr 18 olle 226     }
4733 05 Apr 18 olle 227     else if (!Meludi.isValidCaseName2(caseName, sampleItemPrefix, sampleItemNumDigits))
4733 05 Apr 18 olle 228     {
4733 05 Apr 18 olle 229       Wizard.setInputStatus('caseName', 'invalid', 'Only name = "' + sampleItemPrefix + '" + ' + sampleItemNumDigits + ' digits is allowed.');
4733 05 Apr 18 olle 230       frm.caseName.focus();
4733 05 Apr 18 olle 231     }
4733 05 Apr 18 olle 232     else
4733 05 Apr 18 olle 233     {
4733 05 Apr 18 olle 234       Wizard.setInputStatus('caseName', 'valid');
4733 05 Apr 18 olle 235       caseIsValid = true;
4733 05 Apr 18 olle 236     }
4733 05 Apr 18 olle 237     
4733 05 Apr 18 olle 238     // If not valid, we prevent the wizard from moving to the next step
4733 05 Apr 18 olle 239     if (!caseIsValid) event.preventDefault();
4733 05 Apr 18 olle 240   }
4733 05 Apr 18 olle 241   
4733 05 Apr 18 olle 242   streg.initializeStep2 = function()
4733 05 Apr 18 olle 243   {
4733 05 Apr 18 olle 244     var frm = document.forms['meludi'];  
4733 05 Apr 18 olle 245     var caseName = frm.caseName.value;
4733 05 Apr 18 olle 246     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 247     url += '&cmd=GetCaseInfo';
4733 05 Apr 18 olle 248     url += '&caseName=' + encodeURIComponent(caseName);
4733 05 Apr 18 olle 249     
4733 05 Apr 18 olle 250     Wizard.showLoadingAnimation('Loading information about case...');
4733 05 Apr 18 olle 251     Wizard.asyncJsonRequest(url, streg.caseInfoLoaded);
4733 05 Apr 18 olle 252   }
4733 05 Apr 18 olle 253
4733 05 Apr 18 olle 254   streg.caseInfoLoaded = function(response)
4733 05 Apr 18 olle 255   {
4733 05 Apr 18 olle 256     var frm = document.forms['meludi'];  
4733 05 Apr 18 olle 257     caseInfo = response.caseInfo;
4733 05 Apr 18 olle 258     
4733 05 Apr 18 olle 259     Wizard.setCurrentStep(2);
4733 05 Apr 18 olle 260     Doc.show('gocancel');
4733 05 Apr 18 olle 261     Doc.show('gonext');
4733 05 Apr 18 olle 262     
4733 05 Apr 18 olle 263     frm.arrivalDate.value = Dates.formatDate(new Date(), 'yyyyMMdd');
4733 05 Apr 18 olle 264
4733 05 Apr 18 olle 265     // If site determined by site prefix in case name, set site default value and disable site menu
4733 05 Apr 18 olle 266     //alert("specimentube.js:: streg.caseInfoLoaded: caseInfo.siteDefault = " + caseInfo.siteDefault);
4733 05 Apr 18 olle 267     if (caseInfo.siteDefault != null)
4733 05 Apr 18 olle 268     {
4733 05 Apr 18 olle 269       frm.site.value = caseInfo.siteDefault;
4733 05 Apr 18 olle 270       frm.site.disabled = true;
4733 05 Apr 18 olle 271     }
4733 05 Apr 18 olle 272
4733 05 Apr 18 olle 273     frm.nofTubes.focus();
4733 05 Apr 18 olle 274     frm.nofTubes.setSelectionRange(0,1);
4734 05 Apr 18 olle 275     frm.mutationAnalysisTst170.checked = true;
4733 05 Apr 18 olle 276   }
4733 05 Apr 18 olle 277   
4733 05 Apr 18 olle 278   streg.padOnChange = function()
4733 05 Apr 18 olle 279   {
4733 05 Apr 18 olle 280     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 281     var PAD = frm.pad.value;
4733 05 Apr 18 olle 282     if (PAD == '')
4733 05 Apr 18 olle 283     {
4733 05 Apr 18 olle 284       Wizard.setInputStatus('pad', 'warning', 'Missing');
4733 05 Apr 18 olle 285       return;
4733 05 Apr 18 olle 286     }
4733 05 Apr 18 olle 287     frm.pad.value = PAD.replace(/\+/, '-');
4733 05 Apr 18 olle 288     Wizard.setInputStatus('pad', 'valid');
4733 05 Apr 18 olle 289   }
4733 05 Apr 18 olle 290
4733 05 Apr 18 olle 291   streg.nofTubesOnChange = function()
4733 05 Apr 18 olle 292   {
4733 05 Apr 18 olle 293     nofTubesIsValid = false;
4733 05 Apr 18 olle 294
4733 05 Apr 18 olle 295     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 296     var nofTubes = frm.nofTubes.value;
4733 05 Apr 18 olle 297     
4733 05 Apr 18 olle 298     if (nofTubes == '')
4733 05 Apr 18 olle 299     {
4733 05 Apr 18 olle 300       Wizard.setInputStatus('nofTubes', 'invalid', 'Missing');
4733 05 Apr 18 olle 301       return;
4733 05 Apr 18 olle 302     }
4733 05 Apr 18 olle 303     if (parseInt(nofTubes) < 1)
4733 05 Apr 18 olle 304     {
4733 05 Apr 18 olle 305       Wizard.setInputStatus('nofTubes', 'invalid', 'Must be at least 1');
4733 05 Apr 18 olle 306       return;    
4733 05 Apr 18 olle 307     }
4733 05 Apr 18 olle 308     Wizard.setInputStatus('nofTubes', 'valid');
4733 05 Apr 18 olle 309     nofTubesIsValid = true; 
4733 05 Apr 18 olle 310   }
4733 05 Apr 18 olle 311
4733 05 Apr 18 olle 312   streg.samplingDateOnChange = function()
4733 05 Apr 18 olle 313   {
4733 05 Apr 18 olle 314     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 315     
4733 05 Apr 18 olle 316     samplingDateIsValid = false;
4733 05 Apr 18 olle 317     Wizard.setInputStatus('samplingDate');
4733 05 Apr 18 olle 318     
4733 05 Apr 18 olle 319     var samplingDate = frm.samplingDate.value;
4733 05 Apr 18 olle 320
4733 05 Apr 18 olle 321     if (samplingDate != '')
4733 05 Apr 18 olle 322     {
4733 05 Apr 18 olle 323       // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
4733 05 Apr 18 olle 324       samplingDate = Meludi.autoFillDate(samplingDate);
4733 05 Apr 18 olle 325       frm.samplingDate.value = samplingDate;
4733 05 Apr 18 olle 326     
4733 05 Apr 18 olle 327       var d = Dates.parseString(samplingDate, 'yyyyMMdd');
4733 05 Apr 18 olle 328       if (d == null)
4733 05 Apr 18 olle 329       {
4733 05 Apr 18 olle 330         Wizard.setInputStatus('samplingDate', 'invalid', 'Not a valid date');
4733 05 Apr 18 olle 331         return;
4733 05 Apr 18 olle 332       }
4733 05 Apr 18 olle 333       
4733 05 Apr 18 olle 334       var today = new Date();
4733 05 Apr 18 olle 335       if (d.getTime() > today.getTime())
4733 05 Apr 18 olle 336       {
4733 05 Apr 18 olle 337         Wizard.setInputStatus('samplingDate', 'invalid', 'Future date is not valid');
4733 05 Apr 18 olle 338         return;
4733 05 Apr 18 olle 339       }
4733 05 Apr 18 olle 340
4733 05 Apr 18 olle 341       var arrivalDate = frm.arrivalDate.value;
4733 05 Apr 18 olle 342       if (arrivalDate != '' && arrivalDate < samplingDate)
4733 05 Apr 18 olle 343       {
4733 05 Apr 18 olle 344         Wizard.setInputStatus('samplingDate', 'invalid', 'Arrival date is before sampling date');
4733 05 Apr 18 olle 345         return;
4733 05 Apr 18 olle 346       }
4733 05 Apr 18 olle 347
4733 05 Apr 18 olle 348       Wizard.setInputStatus('samplingDate', 'valid');
4733 05 Apr 18 olle 349     }
4733 05 Apr 18 olle 350     samplingDateIsValid = true;
4733 05 Apr 18 olle 351   }
4733 05 Apr 18 olle 352   
4733 05 Apr 18 olle 353   streg.projectFocusOnChange = function()
4733 05 Apr 18 olle 354   {
4733 05 Apr 18 olle 355     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 356     var projectFocus = frm.projectFocus.value;
4733 05 Apr 18 olle 357
4733 05 Apr 18 olle 358     streg.mutationAnalysisReset();
4734 05 Apr 18 olle 359
4734 05 Apr 18 olle 360 /*    
4733 05 Apr 18 olle 361     if (projectFocus == 'melanoma')
4733 05 Apr 18 olle 362     {
4733 05 Apr 18 olle 363       frm.mutationAnalysisNras.checked = true;
4733 05 Apr 18 olle 364       frm.mutationAnalysisBraf.checked = true;
4733 05 Apr 18 olle 365       frm.mutationAnalysisKit.checked = true;
4733 05 Apr 18 olle 366       return;
4733 05 Apr 18 olle 367     }
4733 05 Apr 18 olle 368     if (projectFocus == 'lungcancer')
4733 05 Apr 18 olle 369     {
4733 05 Apr 18 olle 370       frm.mutationAnalysisKras.checked = true;
4733 05 Apr 18 olle 371       frm.mutationAnalysisEgfr.checked = true;
4733 05 Apr 18 olle 372       return;
4733 05 Apr 18 olle 373     }
4733 05 Apr 18 olle 374     if (projectFocus == 'coloncancer')
4733 05 Apr 18 olle 375     {
4733 05 Apr 18 olle 376       frm.mutationAnalysisKras.checked = true;
4733 05 Apr 18 olle 377       frm.mutationAnalysisNras.checked = true;
4733 05 Apr 18 olle 378       frm.mutationAnalysisBraf.checked = true;
4733 05 Apr 18 olle 379       return;
4733 05 Apr 18 olle 380     }
4733 05 Apr 18 olle 381     if (projectFocus == 'GIST')
4733 05 Apr 18 olle 382     {
4733 05 Apr 18 olle 383       frm.mutationAnalysisPdgfra.checked = true;
4733 05 Apr 18 olle 384       frm.mutationAnalysisKit.checked = true;
4733 05 Apr 18 olle 385       return;
4733 05 Apr 18 olle 386     }
4734 05 Apr 18 olle 387 */
4734 05 Apr 18 olle 388     frm.mutationAnalysisTst170.checked = true;
4733 05 Apr 18 olle 389   }
4733 05 Apr 18 olle 390
4733 05 Apr 18 olle 391   streg.mutationAnalysisReset = function()
4733 05 Apr 18 olle 392   {
4733 05 Apr 18 olle 393     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 394
4779 20 Apr 18 olle 395 /*
4733 05 Apr 18 olle 396     frm.mutationAnalysisKras.checked = false;
4733 05 Apr 18 olle 397     frm.mutationAnalysisNras.checked = false;
4733 05 Apr 18 olle 398     frm.mutationAnalysisBraf.checked = false;
4733 05 Apr 18 olle 399     frm.mutationAnalysisEgfr.checked = false;
4733 05 Apr 18 olle 400     frm.mutationAnalysisAlkEml4.checked = false;
4733 05 Apr 18 olle 401     frm.mutationAnalysisPdgfra.checked = false;
4733 05 Apr 18 olle 402     frm.mutationAnalysisKit.checked = false;
4779 20 Apr 18 olle 403 */
4733 05 Apr 18 olle 404     frm.mutationAnalysisTst170.checked = false;
4733 05 Apr 18 olle 405     frm.mutationAnalysisOther.checked = false;
4733 05 Apr 18 olle 406   }
4733 05 Apr 18 olle 407
4733 05 Apr 18 olle 408   streg.mutationAnalysisSelectAll = function()
4733 05 Apr 18 olle 409   {
4733 05 Apr 18 olle 410     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 411
4779 20 Apr 18 olle 412 /*
4733 05 Apr 18 olle 413     frm.mutationAnalysisKras.checked = true;
4733 05 Apr 18 olle 414     frm.mutationAnalysisNras.checked = true;
4733 05 Apr 18 olle 415     frm.mutationAnalysisBraf.checked = true;
4733 05 Apr 18 olle 416     frm.mutationAnalysisEgfr.checked = true;
4733 05 Apr 18 olle 417     frm.mutationAnalysisAlkEml4.checked = true;
4733 05 Apr 18 olle 418     frm.mutationAnalysisPdgfra.checked = true;
4733 05 Apr 18 olle 419     frm.mutationAnalysisKit.checked = true;
4779 20 Apr 18 olle 420 */
4733 05 Apr 18 olle 421     //frm.mutationAnalysisTst170.checked = true;
4733 05 Apr 18 olle 422     //frm.mutationAnalysisOther.checked = true;
4733 05 Apr 18 olle 423   }
4733 05 Apr 18 olle 424
4733 05 Apr 18 olle 425   streg.viableTumourCellsPercentOnChange = function()
4733 05 Apr 18 olle 426   {
4733 05 Apr 18 olle 427     viableTumourCellsPercentIsValid = false;
4733 05 Apr 18 olle 428
4733 05 Apr 18 olle 429     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 430     var viableTumourCellsPercent = frm.viableTumourCellsPercent.value;
4733 05 Apr 18 olle 431     
4733 05 Apr 18 olle 432     if (viableTumourCellsPercent != null)
4733 05 Apr 18 olle 433     {
4733 05 Apr 18 olle 434       if (parseInt(viableTumourCellsPercent) < 0)
4733 05 Apr 18 olle 435       {
4733 05 Apr 18 olle 436         Wizard.setInputStatus('viableTumourCellsPercent', 'invalid', 'Must be at least 0');
4733 05 Apr 18 olle 437         return;    
4733 05 Apr 18 olle 438       }
4733 05 Apr 18 olle 439       if (parseInt(viableTumourCellsPercent) > 100)
4733 05 Apr 18 olle 440       {
4733 05 Apr 18 olle 441         Wizard.setInputStatus('viableTumourCellsPercent', 'invalid', 'Must be at most 100');
4733 05 Apr 18 olle 442         return;    
4733 05 Apr 18 olle 443       }
4733 05 Apr 18 olle 444     }
4733 05 Apr 18 olle 445     Wizard.setInputStatus('viableTumourCellsPercent', 'valid');
4733 05 Apr 18 olle 446     viableTumourCellsPercentIsValid = true; 
4733 05 Apr 18 olle 447   }
4733 05 Apr 18 olle 448
4733 05 Apr 18 olle 449   streg.validateStep2 = function(event)
4733 05 Apr 18 olle 450   {
4733 05 Apr 18 olle 451     var valid = true;
4733 05 Apr 18 olle 452     var frm = document.forms['meludi'];  
4733 05 Apr 18 olle 453
4733 05 Apr 18 olle 454     valid &= nofTubesIsValid;
4733 05 Apr 18 olle 455     valid &= Wizard.isValid('arrivalDate');
4733 05 Apr 18 olle 456     valid &= samplingDateIsValid;
4733 05 Apr 18 olle 457     valid &= viableTumourCellsPercentIsValid;
4733 05 Apr 18 olle 458     
4733 05 Apr 18 olle 459     if (!valid) event.preventDefault();
4733 05 Apr 18 olle 460   }
4733 05 Apr 18 olle 461
4733 05 Apr 18 olle 462   streg.initializeStep3 = function()
4733 05 Apr 18 olle 463   {
4733 05 Apr 18 olle 464     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 465     var tubeContentType = frm.tubeContentType.value;
4733 05 Apr 18 olle 466     var nofTubes = parseInt(frm.nofTubes.value);
4733 05 Apr 18 olle 467     nofTubes = streg.fixNofTubes(tubeContentType, nofTubes);
4733 05 Apr 18 olle 468     frm.nofTubes.value = nofTubes;
4733 05 Apr 18 olle 469     var extractsFromFirstSpecimenOnly = frm.extractsFromFirstSpecimenOnlyCB.checked;
4733 05 Apr 18 olle 470     var storageBoxSuffix = streg.fetchStorageBoxSuffix(tubeContentType);
4733 05 Apr 18 olle 471     if (nofTubes > 2) Doc.addClass('step-2', 'auto-hide');
4733 05 Apr 18 olle 472     
4733 05 Apr 18 olle 473     var html = '';
4733 05 Apr 18 olle 474
4733 05 Apr 18 olle 475     // Add buttons for adding standard comments for all specimens/RNA/DNA
4733 05 Apr 18 olle 476     html += '<tr class="section-header">';
4733 05 Apr 18 olle 477     html += '<td colspan="4">Standard comments</td>';
4733 05 Apr 18 olle 478     html += '</tr>';
4733 05 Apr 18 olle 479
4733 05 Apr 18 olle 480     html += '<tr class="align-top">';
4733 05 Apr 18 olle 481     html += '<td class="subprompt"></td>';
4733 05 Apr 18 olle 482     html += '<td><div class="button basicbutton interactable" id="addCarvedOutComment" style="font-weight: normal;">Add &quot;Utkarvad&quot; (Carved out)</div></td>';
4733 05 Apr 18 olle 483     html += '<td class="status" id="addCarvedOutComment.status"></td>';
4733 05 Apr 18 olle 484     html += '<td class="help"><span id="addCarvedOutComment.message" class="message"></span>Click button to add standard comment for all items.</td>';    
4733 05 Apr 18 olle 485     html += '</tr>';
4733 05 Apr 18 olle 486
4733 05 Apr 18 olle 487     html += '<tr class="align-top">';
4733 05 Apr 18 olle 488     html += '<td class="subprompt"></td>';
4733 05 Apr 18 olle 489     html += '<td><div class="button basicbutton interactable" id="addMnbComment" style="font-weight: normal;">Add &quot;MNB&quot; (Medium needle biopsy)</div></td>';
4733 05 Apr 18 olle 490     html += '<td class="status" id="addMnbComment.status"></td>';
4733 05 Apr 18 olle 491     html += '<td class="help"><span id="addMnbComment.message" class="message"></span>Click button to add standard comment for all items.</td>';    
4733 05 Apr 18 olle 492     html += '</tr>';
4733 05 Apr 18 olle 493
4733 05 Apr 18 olle 494     for (var i=0; i < nofTubes; i++)
4733 05 Apr 18 olle 495     {
4733 05 Apr 18 olle 496       var tubeContentTypeName = streg.fetchTubeContentTypeName(tubeContentType, i);
4733 05 Apr 18 olle 497       var tubeContentTypeNameInternal = streg.fetchTubeContentTypeNameInternal(tubeContentType, tubeContentTypeName);
4733 05 Apr 18 olle 498       var tubeName = streg.fetchTubeName(tubeContentType, caseInfo, i);
4733 05 Apr 18 olle 499       var tubeNo = i+caseInfo.specimenFirstIndex;
4733 05 Apr 18 olle 500       var tubeIdentifier = streg.fetchTubeIdentifier(tubeContentType, tubeName, tubeNo);
4733 05 Apr 18 olle 501       html += '<tr class="section-header">';
4733 05 Apr 18 olle 502       html += '<td colspan="4">'+tubeContentTypeName+' Tube '+tubeName+'</td>';
4733 05 Apr 18 olle 503       html += '</tr>';
4733 05 Apr 18 olle 504
4733 05 Apr 18 olle 505 /*
4733 05 Apr 18 olle 506       var boxMsg = 'Box-number where the '+tubeContentTypeNameInternal+' tube is located in.';
4733 05 Apr 18 olle 507 */
4733 05 Apr 18 olle 508       var boxMsg = 'Box-number and position where the '+tubeContentTypeNameInternal+' tube is located.';
4733 05 Apr 18 olle 509       var dnaBoxMsg = 'Box-number and position where the DNA extract will be located.';
4733 05 Apr 18 olle 510       var rnaBoxMsg = 'Box-number and position where the RNA extract will be located.';
4733 05 Apr 18 olle 511       var disabledAttribute = '';
4733 05 Apr 18 olle 512       if (i == 0 && tubeContentType == 'Specimen')
4733 05 Apr 18 olle 513       {
4733 05 Apr 18 olle 514         boxMsg = 'No storage space allocated for first '+tubeContentTypeNameInternal+'; all amount expected to be used.';
4733 05 Apr 18 olle 515         disabledAttribute = ' disabled';
4733 05 Apr 18 olle 516       }  
4733 05 Apr 18 olle 517       html += '<tr>';
4733 05 Apr 18 olle 518       html += '<td class="subprompt">'+tubeContentTypeName+'&nbsp;'+tubeName+'&nbsp;&nbsp;&nbsp;'+'Box</td>';
4733 05 Apr 18 olle 519       html += '<td class="input">';
4733 05 Apr 18 olle 520 /*
4733 05 Apr 18 olle 521       html += '<input type="text" name="box.'+i+'" id="box.'+i+'" style="width: 12em;" maxlength="12"'+disabledAttribute+'></td>';
4733 05 Apr 18 olle 522 */
4733 05 Apr 18 olle 523       html += '<input type="text" name="box.'+i+'" id="box.'+i+'" style="width: 12em;" maxlength="12"'+disabledAttribute+'>';
4733 05 Apr 18 olle 524       html += '&nbsp;Row<input type="text" name="row.'+i+'" id="row.'+i+'" style="text-transform:uppercase; width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 525       html += '&nbsp;Column<input type="text" name="column.'+i+'" id="column.'+i+'" style="width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 526       html += '</td>';
4733 05 Apr 18 olle 527       html += '<td class="status" id="box.'+i+'.status"></td>';
4733 05 Apr 18 olle 528       html += '<td class="help"><span id="box.'+i+'.message" class="message"></span>'+boxMsg+'<span id="position.'+i+'.message" class="message"></span></td>';
4733 05 Apr 18 olle 529       html += '</tr>';
4733 05 Apr 18 olle 530 /*      
4733 05 Apr 18 olle 531       html += '<tr>';
4733 05 Apr 18 olle 532       html += '<td class="subprompt">Row</td>';
4733 05 Apr 18 olle 533       html += '<td class="input">';
4733 05 Apr 18 olle 534       html += '<input type="text" name="row.'+i+'" id="row.'+i+'" style="text-transform:uppercase; width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 535       html += '&nbsp;Column<input type="text" name="column.'+i+'" id="column.'+i+'" style="width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 536       html += '</td>';
4733 05 Apr 18 olle 537       html += '<td class="status" id="position.'+i+'.status"></td>';
4733 05 Apr 18 olle 538       html += '<td class="help"><span id="position.'+i+'.message" class="message"></span></td>';    
4733 05 Apr 18 olle 539       html += '</tr>';
4733 05 Apr 18 olle 540 */
4733 05 Apr 18 olle 541
4733 05 Apr 18 olle 542       if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 543       {
4733 05 Apr 18 olle 544         disabledAttribute = '';
4733 05 Apr 18 olle 545         if (i == 0 || !extractsFromFirstSpecimenOnly)
4733 05 Apr 18 olle 546         {
4733 05 Apr 18 olle 547           html += '<tr>';
4733 05 Apr 18 olle 548           html += '<td class="subprompt">DNA extract'+'&nbsp;'+tubeName+'.d&nbsp;&nbsp;&nbsp;'+'Box</td>';
4733 05 Apr 18 olle 549           html += '<td class="input">';
4733 05 Apr 18 olle 550           html += '<input type="text" name="dnaBox.'+i+'" id="dnaBox.'+i+'" style="width: 12em;" maxlength="12"'+disabledAttribute+'>';
4733 05 Apr 18 olle 551           html += '&nbsp;Row<input type="text" name="dnaRow.'+i+'" id="dnaRow.'+i+'" style="text-transform:uppercase; width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 552           html += '&nbsp;Column<input type="text" name="dnaColumn.'+i+'" id="dnaColumn.'+i+'" style="width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 553           html += '</td>';
4733 05 Apr 18 olle 554           html += '<td class="status" id="dnaBox.'+i+'.status"></td>';
4733 05 Apr 18 olle 555           html += '<td class="help"><span id="dnaBox.'+i+'.message" class="message"></span>'+dnaBoxMsg+'<span id="dnaPosition.'+i+'.message" class="message"></span></td>';
4733 05 Apr 18 olle 556           html += '</tr>';
4733 05 Apr 18 olle 557
4733 05 Apr 18 olle 558           html += '<tr>';
4733 05 Apr 18 olle 559           html += '<td class="subprompt">RNA extract'+'&nbsp;'+tubeName+'.r&nbsp;&nbsp;&nbsp;'+'Box</td>';
4733 05 Apr 18 olle 560           html += '<td class="input">';
4733 05 Apr 18 olle 561           html += '<input type="text" name="rnaBox.'+i+'" id="rnaBox.'+i+'" style="width: 12em;" maxlength="12"'+disabledAttribute+'>';
4733 05 Apr 18 olle 562           html += '&nbsp;Row<input type="text" name="rnaRow.'+i+'" id="rnaRow.'+i+'" style="text-transform:uppercase; width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 563           html += '&nbsp;Column<input type="text" name="rnaColumn.'+i+'" id="rnaColumn.'+i+'" style="width: 3em;" maxlength="2"'+disabledAttribute+'>';
4733 05 Apr 18 olle 564           html += '</td>';
4733 05 Apr 18 olle 565           html += '<td class="status" id="rnaBox.'+i+'.status"></td>';
4733 05 Apr 18 olle 566           html += '<td class="help"><span id="rnaBox.'+i+'.message" class="message"></span>'+rnaBoxMsg+'<span id="rnaPosition.'+i+'.message" class="message"></span></td>';
4733 05 Apr 18 olle 567           html += '</tr>';
4733 05 Apr 18 olle 568         }
4733 05 Apr 18 olle 569
4733 05 Apr 18 olle 570         html += '<tr>';
4733 05 Apr 18 olle 571         html += '<td class="subprompt">Number of sections</td>';
4733 05 Apr 18 olle 572         html += '<td class="input">';
4733 05 Apr 18 olle 573         html += '<input type="text" name="nofSections.'+i+'" id="nofSections.'+i+'" style="width: 3em;" maxlength="2" value="1">';
4733 05 Apr 18 olle 574         html += '</td>';
4733 05 Apr 18 olle 575         html += '<td class="status" id="nofSections.'+i+'.status"></td>';
4733 05 Apr 18 olle 576         html += '<td class="help"><span id="nofSections.'+i+'.message" class="message"></span>Number of sections (slices) in FFPE block.</td>';    
4733 05 Apr 18 olle 577         html += '</tr>';
4733 05 Apr 18 olle 578       }
4733 05 Apr 18 olle 579
4733 05 Apr 18 olle 580       html += '<tr class="align-top">';
4733 05 Apr 18 olle 581       html += '<td class="subprompt">Operator delivery comment</td>';
4733 05 Apr 18 olle 582       html += '<td class="input"><textarea rows="3" name="comment.'+i+'" id="comment.'+i+'"></textarea></td>';
4733 05 Apr 18 olle 583       html += '<td class="status" id="comment.'+i+'.status"></td>';
4733 05 Apr 18 olle 584       html += '<td class="help"><span id="comment.'+i+'.message" class="message"></span>In this field, enter information specific for '+tubeContentTypeNameInternal+' tube ' +tubeIdentifier+'.</td>';    
4733 05 Apr 18 olle 585       html += '</tr>';
4733 05 Apr 18 olle 586     }
4733 05 Apr 18 olle 587     Doc.element('specimen-tubes').innerHTML = html;
4733 05 Apr 18 olle 588
4733 05 Apr 18 olle 589     // Add click handlers for buttons for adding standard comments for all specimens/RNA/DNA
4733 05 Apr 18 olle 590     var addCarvedOutCommentGeneralButton = Doc.element('addCarvedOutComment');
4733 05 Apr 18 olle 591     Buttons.addClickHandler(addCarvedOutCommentGeneralButton, streg.addCommentGeneral, {'nofTubes': nofTubes, 'text-field': 'comment.', 'text': 'Utkarvad.'});
4733 05 Apr 18 olle 592     var addMnbCommentGeneralButton = Doc.element('addMnbComment');
4733 05 Apr 18 olle 593     Buttons.addClickHandler(addMnbCommentGeneralButton, streg.addCommentGeneral, {'nofTubes': nofTubes, 'text-field': 'comment.', 'text': 'MNB.'});
4733 05 Apr 18 olle 594
4733 05 Apr 18 olle 595     Wizard.setCurrentStep(3);
4733 05 Apr 18 olle 596     Doc.show('goregister');
4733 05 Apr 18 olle 597     Doc.show('gocancel');
4733 05 Apr 18 olle 598     frm['comment.0'].focus();
4733 05 Apr 18 olle 599     
4733 05 Apr 18 olle 600     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 601     url += '&cmd=FindStoragePositions';  
4733 05 Apr 18 olle 602     url += '&nofTubes='+frm.nofTubes.value;
4733 05 Apr 18 olle 603     url += '&storageBoxSuffix='+storageBoxSuffix;
4733 05 Apr 18 olle 604     url += '&extractsFromFirstSpecimenOnly='+extractsFromFirstSpecimenOnly;
4733 05 Apr 18 olle 605     
4733 05 Apr 18 olle 606     Wizard.showLoadingAnimation('Looking for empty box positions...');
4733 05 Apr 18 olle 607     Wizard.asyncJsonRequest(url, streg.storagePositionsLoaded);
4733 05 Apr 18 olle 608   }
4733 05 Apr 18 olle 609
4733 05 Apr 18 olle 610   streg.addCommentGeneral = function(event)
4733 05 Apr 18 olle 611   {
4733 05 Apr 18 olle 612     var nofTubes = Data.get(event.currentTarget, 'nofTubes', event.currentTarget.id);
4733 05 Apr 18 olle 613     var textFieldBase = Data.get(event.currentTarget, 'text-field', event.currentTarget.id);
4733 05 Apr 18 olle 614     var text = Data.get(event.currentTarget, 'text', event.currentTarget.id);
4733 05 Apr 18 olle 615     for (var i=0; i < nofTubes; i++)
4733 05 Apr 18 olle 616     {
4733 05 Apr 18 olle 617       var textField = Doc.element(textFieldBase+i);
4733 05 Apr 18 olle 618       if (textField)
4733 05 Apr 18 olle 619       {
4733 05 Apr 18 olle 620         if (text && text != '')
4733 05 Apr 18 olle 621         {
4733 05 Apr 18 olle 622           if (textField.value != '')
4733 05 Apr 18 olle 623           {
4733 05 Apr 18 olle 624             textField.value += ' ';
4733 05 Apr 18 olle 625           }
4733 05 Apr 18 olle 626           textField.value += text;
4733 05 Apr 18 olle 627         }
4733 05 Apr 18 olle 628       }
4733 05 Apr 18 olle 629     }
4733 05 Apr 18 olle 630     streg.setNumberOfSectionsFromComment(event);
4733 05 Apr 18 olle 631   }
4733 05 Apr 18 olle 632   
4733 05 Apr 18 olle 633   streg.addComment = function(event)
4733 05 Apr 18 olle 634   {
4733 05 Apr 18 olle 635     var textField = Doc.element(Data.get(event.currentTarget, 'text-field', event.currentTarget.id));
4733 05 Apr 18 olle 636     var text = Data.get(event.currentTarget, 'text', event.currentTarget.id);
4733 05 Apr 18 olle 637     if (textField)
4733 05 Apr 18 olle 638     {
4733 05 Apr 18 olle 639       if (text && text != '')
4733 05 Apr 18 olle 640       {
4733 05 Apr 18 olle 641         if (textField.value != '')
4733 05 Apr 18 olle 642         {
4733 05 Apr 18 olle 643           textField.value += ' ';
4733 05 Apr 18 olle 644         }
4733 05 Apr 18 olle 645         textField.value += text;
4733 05 Apr 18 olle 646       }
4733 05 Apr 18 olle 647     }
4733 05 Apr 18 olle 648     streg.setNumberOfSectionsFromComment(event);
4733 05 Apr 18 olle 649   }
4733 05 Apr 18 olle 650
4733 05 Apr 18 olle 651   streg.setNumberOfSectionsFromComment = function(event)
4733 05 Apr 18 olle 652   {
4733 05 Apr 18 olle 653     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 654     var nofTubes = Data.get(event.currentTarget, 'nofTubes', event.currentTarget.id);
4733 05 Apr 18 olle 655     var textFieldBase = Data.get(event.currentTarget, 'text-field', event.currentTarget.id);
4733 05 Apr 18 olle 656     for (var i=0; i < nofTubes; i++)
4733 05 Apr 18 olle 657     {
4733 05 Apr 18 olle 658       var numSections = 1;
4733 05 Apr 18 olle 659       var textField = Doc.element(textFieldBase+i);
4733 05 Apr 18 olle 660       if (textField)
4733 05 Apr 18 olle 661       {
4733 05 Apr 18 olle 662         var text = textField.value;
4733 05 Apr 18 olle 663         if (text && text != '')
4733 05 Apr 18 olle 664         {
4733 05 Apr 18 olle 665           // If comment "Utkarvad." and not "MNB." => number of sections set to 0
4733 05 Apr 18 olle 666           if (text.indexOf('Utkarvad.') >= 0 && text.indexOf('MNB.') < 0)
4733 05 Apr 18 olle 667           {
4733 05 Apr 18 olle 668             numSections = 0;
4733 05 Apr 18 olle 669           }
4733 05 Apr 18 olle 670         }
4733 05 Apr 18 olle 671       }
4733 05 Apr 18 olle 672       frm['nofSections.'+i].value = numSections;
4733 05 Apr 18 olle 673     }
4733 05 Apr 18 olle 674   }
4733 05 Apr 18 olle 675   
4733 05 Apr 18 olle 676   streg.storagePositionsLoaded = function(response)
4733 05 Apr 18 olle 677   {
4733 05 Apr 18 olle 678     var freeWells = response.wells;
4733 05 Apr 18 olle 679     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 680     var tubeContentType = frm.tubeContentType.value;
4733 05 Apr 18 olle 681     var nofTubes = parseInt(frm.nofTubes.value);
4733 05 Apr 18 olle 682     var extractsFromFirstSpecimenOnly = frm.extractsFromFirstSpecimenOnlyCB.checked;
4733 05 Apr 18 olle 683
4733 05 Apr 18 olle 684     // No storage space is allocated for first specimen,
4733 05 Apr 18 olle 685     // since all amount is expected to be used for analysis.
4733 05 Apr 18 olle 686     // Specimen tube with i == 0 is therefore skipped.
4733 05 Apr 18 olle 687     if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 688     {
4733 05 Apr 18 olle 689       for (var i = 0; i < nofTubes; i++)
4733 05 Apr 18 olle 690       {
4733 05 Apr 18 olle 691         wellIndex = 3*i;
4733 05 Apr 18 olle 692         var specWell = null;
4733 05 Apr 18 olle 693         if (i > 0)
4733 05 Apr 18 olle 694         {
4733 05 Apr 18 olle 695           specWell = freeWells[wellIndex];
4733 05 Apr 18 olle 696           if (!specWell || specWell == '') 
4733 05 Apr 18 olle 697           {
4733 05 Apr 18 olle 698             Wizard.setInputStatus('box.'+i, 'invalid', 'Missing box');
4733 05 Apr 18 olle 699             return;
4733 05 Apr 18 olle 700           }
4733 05 Apr 18 olle 701         }
4733 05 Apr 18 olle 702         var dnaWell = null;
4733 05 Apr 18 olle 703         if (i == 0 || !extractsFromFirstSpecimenOnly)
4733 05 Apr 18 olle 704         {
4733 05 Apr 18 olle 705           dnaWell = freeWells[wellIndex+1];
4733 05 Apr 18 olle 706           if (!dnaWell || dnaWell == '') 
4733 05 Apr 18 olle 707           {
4733 05 Apr 18 olle 708             Wizard.setInputStatus('dnaBox.'+i, 'invalid', 'Missing box');
4733 05 Apr 18 olle 709             return;
4733 05 Apr 18 olle 710           }
4733 05 Apr 18 olle 711         }
4733 05 Apr 18 olle 712         var rnaWell = null;
4733 05 Apr 18 olle 713         if (i == 0 || !extractsFromFirstSpecimenOnly)
4733 05 Apr 18 olle 714         {
4733 05 Apr 18 olle 715           rnaWell = freeWells[wellIndex+2];
4733 05 Apr 18 olle 716           if (!rnaWell || rnaWell == '') 
4733 05 Apr 18 olle 717           {
4733 05 Apr 18 olle 718             Wizard.setInputStatus('rnaBox.'+i, 'invalid', 'Missing box');
4733 05 Apr 18 olle 719             return;
4733 05 Apr 18 olle 720           }
4733 05 Apr 18 olle 721         }
4733 05 Apr 18 olle 722
4733 05 Apr 18 olle 723         // Update form fields for storage plates
4733 05 Apr 18 olle 724         if (specWell)
4733 05 Apr 18 olle 725         {
4733 05 Apr 18 olle 726           frm['box.'+i].value = specWell.bioPlate.name;
4733 05 Apr 18 olle 727           frm['row.'+i].value = Meludi.wellToAlpha(specWell.row);
4733 05 Apr 18 olle 728           frm['column.'+i].value = specWell.column+1;
4733 05 Apr 18 olle 729         }
4733 05 Apr 18 olle 730       
4733 05 Apr 18 olle 731         if (dnaWell)
4733 05 Apr 18 olle 732         {
4733 05 Apr 18 olle 733           frm['dnaBox.'+i].value = dnaWell.bioPlate.name;
4733 05 Apr 18 olle 734           frm['dnaRow.'+i].value = Meludi.wellToAlpha(dnaWell.row);
4733 05 Apr 18 olle 735           frm['dnaColumn.'+i].value = dnaWell.column+1;
4733 05 Apr 18 olle 736         }
4733 05 Apr 18 olle 737
4733 05 Apr 18 olle 738         if (rnaWell)
4733 05 Apr 18 olle 739         {
4733 05 Apr 18 olle 740           frm['rnaBox.'+i].value = rnaWell.bioPlate.name;
4733 05 Apr 18 olle 741           frm['rnaRow.'+i].value = Meludi.wellToAlpha(rnaWell.row);
4733 05 Apr 18 olle 742           frm['rnaColumn.'+i].value = rnaWell.column+1;
4733 05 Apr 18 olle 743         }
4733 05 Apr 18 olle 744
4733 05 Apr 18 olle 745         // Move focus to next field
4733 05 Apr 18 olle 746         Events.addEventHandler('box.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'row.'+i });
4733 05 Apr 18 olle 747         Events.addEventHandler('row.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'column.'+i });
4733 05 Apr 18 olle 748         Events.addEventHandler('column.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'dnaBox.'+i });
4733 05 Apr 18 olle 749
4733 05 Apr 18 olle 750         Events.addEventHandler('dnaBox.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'dnaRow.'+i });
4733 05 Apr 18 olle 751         Events.addEventHandler('dnaRow.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'dnaColumn.'+i });
4733 05 Apr 18 olle 752         Events.addEventHandler('dnaColumn.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'rnaBox.'+i });
4733 05 Apr 18 olle 753
4733 05 Apr 18 olle 754         Events.addEventHandler('rnaBox.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'rnaRow.'+i });
4733 05 Apr 18 olle 755         Events.addEventHandler('rnaRow.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'rnaColumn.'+i });
4733 05 Apr 18 olle 756         Events.addEventHandler('rnaColumn.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'nofSections.'+i });
4733 05 Apr 18 olle 757
4733 05 Apr 18 olle 758         Events.addEventHandler('nofSections.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'comment.'+i });
4733 05 Apr 18 olle 759       
4733 05 Apr 18 olle 760         // Form validation
4733 05 Apr 18 olle 761         Events.addEventHandler('column.'+i, 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 762         Events.addEventHandler('box.'+i, 'change', streg.wellOnChange, { 'boxtype': 'Specimen', 'index': i });
4733 05 Apr 18 olle 763         Events.addEventHandler('row.'+i, 'change', streg.wellOnChange, { 'boxtype': 'Specimen', 'index': i });
4733 05 Apr 18 olle 764         Events.addEventHandler('column.'+i, 'change', streg.wellOnChange, { 'boxtype': 'Specimen', 'index': i });
4733 05 Apr 18 olle 765         Events.addEventHandler('box.'+i, 'keyup', streg.boxOnKeyUp, { 'boxtype': 'Specimen'});
4733 05 Apr 18 olle 766
4733 05 Apr 18 olle 767         Events.addEventHandler('dnaColumn.'+i, 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 768         Events.addEventHandler('dnaBox.'+i, 'change', streg.wellOnChange, { 'boxtype': 'DNA', 'index': i });
4733 05 Apr 18 olle 769         Events.addEventHandler('dnaRow.'+i, 'change', streg.wellOnChange, { 'boxtype': 'DNA', 'index': i });
4733 05 Apr 18 olle 770         Events.addEventHandler('dnaColumn.'+i, 'change', streg.wellOnChange, { 'boxtype': 'DNA', 'index': i });
4733 05 Apr 18 olle 771         Events.addEventHandler('dnaBox.'+i, 'keyup', streg.boxOnKeyUp, { 'boxtype': 'DNA'});
4733 05 Apr 18 olle 772
4733 05 Apr 18 olle 773         Events.addEventHandler('rnaColumn.'+i, 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 774         Events.addEventHandler('rnaBox.'+i, 'change', streg.wellOnChange, { 'boxtype': 'RNA', 'index': i });
4733 05 Apr 18 olle 775         Events.addEventHandler('rnaRow.'+i, 'change', streg.wellOnChange, { 'boxtype': 'RNA', 'index': i });
4733 05 Apr 18 olle 776         Events.addEventHandler('rnaColumn.'+i, 'change', streg.wellOnChange, { 'boxtype': 'RNA', 'index': i });
4733 05 Apr 18 olle 777         Events.addEventHandler('rnaBox.'+i, 'keyup', streg.boxOnKeyUp, { 'boxtype': 'RNA'});
4733 05 Apr 18 olle 778
4733 05 Apr 18 olle 779         Events.addEventHandler('nofSections.'+i, 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 780         Events.addEventHandler('nofSections.'+i, 'change', streg.nofSectionsOnChange, { 'index': i });
4733 05 Apr 18 olle 781       
4733 05 Apr 18 olle 782         wellIsValid[i] = true;
4733 05 Apr 18 olle 783         dnaWellIsValid[i] = true;
4733 05 Apr 18 olle 784         rnaWellIsValid[i] = true;
4733 05 Apr 18 olle 785 /*
4733 05 Apr 18 olle 786         Wizard.setInputStatus('position.'+i, 'valid');
4733 05 Apr 18 olle 787 */
4733 05 Apr 18 olle 788         Wizard.setInputStatus('box.'+i, 'valid');
4733 05 Apr 18 olle 789         if (i == 0 || !extractsFromFirstSpecimenOnly)
4733 05 Apr 18 olle 790         {
4733 05 Apr 18 olle 791           Wizard.setInputStatus('dnaBox.'+i, 'valid');
4733 05 Apr 18 olle 792           Wizard.setInputStatus('rnaBox.'+i, 'valid');
4733 05 Apr 18 olle 793         }
4733 05 Apr 18 olle 794         if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 795         {
4733 05 Apr 18 olle 796           Wizard.setInputStatus('nofSections.'+i, 'valid');
4733 05 Apr 18 olle 797         }
4733 05 Apr 18 olle 798       }
4733 05 Apr 18 olle 799     }
4733 05 Apr 18 olle 800     else if (tubeContentType == 'DNA' || tubeContentType == 'RNA' || tubeContentType == 'DNA_RNA')
4733 05 Apr 18 olle 801     {
4733 05 Apr 18 olle 802       for (var i = 0; i < nofTubes; i++)
4733 05 Apr 18 olle 803       {
4733 05 Apr 18 olle 804         var wellIndex = i;
4733 05 Apr 18 olle 805         var well = freeWells[wellIndex];
4733 05 Apr 18 olle 806         if (!well || well == '') 
4733 05 Apr 18 olle 807         {
4733 05 Apr 18 olle 808           Wizard.setInputStatus('box.'+i, 'invalid', 'Missing box');
4733 05 Apr 18 olle 809           return;
4733 05 Apr 18 olle 810         }
4733 05 Apr 18 olle 811         frm['box.'+i].value = well.bioPlate.name;
4733 05 Apr 18 olle 812         frm['row.'+i].value = Meludi.wellToAlpha(well.row);
4733 05 Apr 18 olle 813         frm['column.'+i].value = well.column+1;
4733 05 Apr 18 olle 814       
4733 05 Apr 18 olle 815         // Move focus to next field
4733 05 Apr 18 olle 816         Events.addEventHandler('box.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'row.'+i });
4733 05 Apr 18 olle 817         Events.addEventHandler('row.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'column.'+i });
4733 05 Apr 18 olle 818         Events.addEventHandler('column.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'nofSections.'+i });
4733 05 Apr 18 olle 819         Events.addEventHandler('nofSections.'+i, 'keypress', Wizard.focusOnEnter, { 'next-focus': 'comment.'+i });
4733 05 Apr 18 olle 820       
4733 05 Apr 18 olle 821         // Form validation
4733 05 Apr 18 olle 822         Events.addEventHandler('column.'+i, 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 823         Events.addEventHandler('box.'+i, 'change', streg.wellOnChange, { 'index': i });
4733 05 Apr 18 olle 824         Events.addEventHandler('row.'+i, 'change', streg.wellOnChange, { 'index': i });
4733 05 Apr 18 olle 825         Events.addEventHandler('column.'+i, 'change', streg.wellOnChange, { 'index': i });
4733 05 Apr 18 olle 826         Events.addEventHandler('box.'+i, 'keyup', streg.boxOnKeyUp);
4733 05 Apr 18 olle 827         Events.addEventHandler('nofSections.'+i, 'keypress', Events.integerOnly);
4733 05 Apr 18 olle 828         Events.addEventHandler('nofSections.'+i, 'change', streg.nofSectionsOnChange, { 'index': i });
4733 05 Apr 18 olle 829       
4733 05 Apr 18 olle 830         wellIsValid[i] = true;
4733 05 Apr 18 olle 831 /*
4733 05 Apr 18 olle 832         Wizard.setInputStatus('position.'+i, 'valid');
4733 05 Apr 18 olle 833 */
4733 05 Apr 18 olle 834         Wizard.setInputStatus('box.'+i, 'valid');
4733 05 Apr 18 olle 835         if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 836         {
4733 05 Apr 18 olle 837           Wizard.setInputStatus('nofSections.'+i, 'valid');
4733 05 Apr 18 olle 838         }
4733 05 Apr 18 olle 839       }
4733 05 Apr 18 olle 840     }
4733 05 Apr 18 olle 841   }
4733 05 Apr 18 olle 842
4733 05 Apr 18 olle 843   streg.fixNofTubes = function(tubeContentType, nofTubes)
4733 05 Apr 18 olle 844   {
4733 05 Apr 18 olle 845     if (tubeContentType == 'DNA')
4733 05 Apr 18 olle 846     {
4733 05 Apr 18 olle 847       nofTubes = 1;
4733 05 Apr 18 olle 848     }
4733 05 Apr 18 olle 849     else if (tubeContentType == 'RNA')
4733 05 Apr 18 olle 850     {
4733 05 Apr 18 olle 851       nofTubes = 1;
4733 05 Apr 18 olle 852     }
4733 05 Apr 18 olle 853     else if (tubeContentType == 'DNA_RNA')
4733 05 Apr 18 olle 854     {
4733 05 Apr 18 olle 855       nofTubes = 2;
4733 05 Apr 18 olle 856     }
4733 05 Apr 18 olle 857     return nofTubes;
4733 05 Apr 18 olle 858   }
4733 05 Apr 18 olle 859   
4733 05 Apr 18 olle 860   streg.fetchStorageBoxSuffix = function(tubeContentType)
4733 05 Apr 18 olle 861   {
4733 05 Apr 18 olle 862     var storageBoxSuffix = null;
4733 05 Apr 18 olle 863     if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 864     {
4733 05 Apr 18 olle 865       storageBoxSuffix = '_sp';
4733 05 Apr 18 olle 866     }
4733 05 Apr 18 olle 867     else if (tubeContentType == 'DNA')
4733 05 Apr 18 olle 868     {
4733 05 Apr 18 olle 869       storageBoxSuffix = '_dna';
4733 05 Apr 18 olle 870     }
4733 05 Apr 18 olle 871     else if (tubeContentType == 'RNA')
4733 05 Apr 18 olle 872     {
4733 05 Apr 18 olle 873       storageBoxSuffix = '_rna';
4733 05 Apr 18 olle 874     }
4733 05 Apr 18 olle 875     else if (tubeContentType == 'DNA_RNA')
4733 05 Apr 18 olle 876     {
4733 05 Apr 18 olle 877       storageBoxSuffix = '_dna_rna';
4733 05 Apr 18 olle 878     }
4733 05 Apr 18 olle 879     return storageBoxSuffix;
4733 05 Apr 18 olle 880   }
4733 05 Apr 18 olle 881   
4733 05 Apr 18 olle 882   streg.fetchTubeContentTypeName = function(tubeContentType, tubeIndex)
4733 05 Apr 18 olle 883   {
4733 05 Apr 18 olle 884     var tubeContentTypeName = tubeContentType;
4733 05 Apr 18 olle 885     if (tubeContentType == 'DNA_RNA')
4733 05 Apr 18 olle 886     {
4733 05 Apr 18 olle 887       if (tubeIndex == 0)
4733 05 Apr 18 olle 888       {
4733 05 Apr 18 olle 889         tubeContentTypeName = 'DNA';
4733 05 Apr 18 olle 890       }
4733 05 Apr 18 olle 891       else if (tubeIndex == 1)
4733 05 Apr 18 olle 892       {
4733 05 Apr 18 olle 893         tubeContentTypeName = 'RNA';
4733 05 Apr 18 olle 894       }
4733 05 Apr 18 olle 895     }
4733 05 Apr 18 olle 896     return tubeContentTypeName;
4733 05 Apr 18 olle 897   }
4733 05 Apr 18 olle 898   
4733 05 Apr 18 olle 899   streg.fetchTubeContentTypeNameInternal = function(tubeContentType, tubeContentTypeName)
4733 05 Apr 18 olle 900   {
4733 05 Apr 18 olle 901     var tubeContentTypeNameInternal = tubeContentTypeName;
4733 05 Apr 18 olle 902     // Convert all names except abbreviations to all lower case
4733 05 Apr 18 olle 903     if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 904     {
4733 05 Apr 18 olle 905       tubeContentTypeNameInternal = tubeContentTypeName.toLowerCase();
4733 05 Apr 18 olle 906     }
4733 05 Apr 18 olle 907     return tubeContentTypeNameInternal;
4733 05 Apr 18 olle 908   }
4733 05 Apr 18 olle 909   
4733 05 Apr 18 olle 910   streg.fetchTubeName = function(tubeContentType, caseInfo, tubeIndex)
4733 05 Apr 18 olle 911   {
4733 05 Apr 18 olle 912     var tubeName = Strings.encodeTags(caseInfo.originalName);
4733 05 Apr 18 olle 913     if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 914     {
4733 05 Apr 18 olle 915       var tubeNo = tubeIndex + caseInfo.specimenFirstIndex;
4733 05 Apr 18 olle 916       tubeName = tubeName+'.'+tubeNo;
4733 05 Apr 18 olle 917     }
4733 05 Apr 18 olle 918     else if (tubeContentType == 'DNA')
4733 05 Apr 18 olle 919     {
4733 05 Apr 18 olle 920       tubeName = tubeName+'.d';
4733 05 Apr 18 olle 921     }
4733 05 Apr 18 olle 922     else if (tubeContentType == 'RNA')
4733 05 Apr 18 olle 923     {
4733 05 Apr 18 olle 924       tubeName = tubeName+'.r';
4733 05 Apr 18 olle 925     }
4733 05 Apr 18 olle 926     else if (tubeContentType == 'DNA_RNA')
4733 05 Apr 18 olle 927     {
4733 05 Apr 18 olle 928       if (tubeIndex == 0)
4733 05 Apr 18 olle 929       {
4733 05 Apr 18 olle 930         tubeName = tubeName+'.d';
4733 05 Apr 18 olle 931       }
4733 05 Apr 18 olle 932       else if (tubeIndex == 1)
4733 05 Apr 18 olle 933       {
4733 05 Apr 18 olle 934         tubeName = tubeName+'.r';
4733 05 Apr 18 olle 935       }
4733 05 Apr 18 olle 936     }
4733 05 Apr 18 olle 937     return tubeName;
4733 05 Apr 18 olle 938   }
4733 05 Apr 18 olle 939   
4733 05 Apr 18 olle 940   streg.fetchTubeIdentifier = function(tubeContentType, tubeName, tubeNo)
4733 05 Apr 18 olle 941   {
4733 05 Apr 18 olle 942     var tubeIdentifier = tubeName;
4733 05 Apr 18 olle 943     if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 944     {
4733 05 Apr 18 olle 945       tubeIdentifier = tubeNo;
4733 05 Apr 18 olle 946     }
4733 05 Apr 18 olle 947     return tubeIdentifier;
4733 05 Apr 18 olle 948   }
4733 05 Apr 18 olle 949   
4733 05 Apr 18 olle 950   streg.boxOnKeyUp = function(event)
4733 05 Apr 18 olle 951   {
4733 05 Apr 18 olle 952     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 953     var tubeContentType = frm.tubeContentType.value;
4733 05 Apr 18 olle 954     
4733 05 Apr 18 olle 955     var boxType = Data.get(event.currentTarget, 'boxtype');
4733 05 Apr 18 olle 956     var index = Data.int(event.currentTarget, 'index');
4733 05 Apr 18 olle 957
4733 05 Apr 18 olle 958     // Get box prefix, default is for input tubes
4733 05 Apr 18 olle 959     var boxPrefix = 'box.';
4733 05 Apr 18 olle 960     if (boxType && boxType == 'DNA')
4733 05 Apr 18 olle 961     {
4733 05 Apr 18 olle 962       boxPrefix = 'dnaBox.';
4733 05 Apr 18 olle 963     }
4733 05 Apr 18 olle 964     if (boxType && boxType == 'RNA')
4733 05 Apr 18 olle 965     {
4733 05 Apr 18 olle 966       boxPrefix = 'rnaBox.';
4733 05 Apr 18 olle 967     }
4733 05 Apr 18 olle 968
4733 05 Apr 18 olle 969     // Check box name
4733 05 Apr 18 olle 970     var boxIsValid = true;
4733 05 Apr 18 olle 971     var box = frm[boxPrefix+index].value;
4733 05 Apr 18 olle 972     Wizard.setInputStatus(boxPrefix+index);
4733 05 Apr 18 olle 973     // Check for prefix "ML_"
4733 05 Apr 18 olle 974     if (box.indexOf('ML_') != 0)
4733 05 Apr 18 olle 975     {
4733 05 Apr 18 olle 976       boxIsValid = false;
4733 05 Apr 18 olle 977     }
4733 05 Apr 18 olle 978     var suffix = '_sp';
4733 05 Apr 18 olle 979     if (tubeContentType == 'DNA' || (boxType && boxType == 'DNA'))
4733 05 Apr 18 olle 980     {
4733 05 Apr 18 olle 981       suffix = '_dna';
4733 05 Apr 18 olle 982     }
4733 05 Apr 18 olle 983     else if (tubeContentType == 'RNA' || (boxType && boxType == 'RNA'))
4733 05 Apr 18 olle 984     {
4733 05 Apr 18 olle 985       suffix = '_rna';
4733 05 Apr 18 olle 986     }
4733 05 Apr 18 olle 987     // Check for suffix
4733 05 Apr 18 olle 988     if (box.indexOf(suffix) != (box.length - suffix.length))
4733 05 Apr 18 olle 989     {
4733 05 Apr 18 olle 990       boxIsValid = false;
4733 05 Apr 18 olle 991     }
4733 05 Apr 18 olle 992     
4733 05 Apr 18 olle 993     if (!boxIsValid)
4733 05 Apr 18 olle 994     {
4733 05 Apr 18 olle 995       Wizard.setInputStatus(boxPrefix+index, 'invalid', 'Box name must start with "ML_" and end with "'+suffix+'"');
4733 05 Apr 18 olle 996       return;
4733 05 Apr 18 olle 997     }
4733 05 Apr 18 olle 998   }
4733 05 Apr 18 olle 999   
4733 05 Apr 18 olle 1000   streg.wellOnChange = function(event)
4733 05 Apr 18 olle 1001   {
4733 05 Apr 18 olle 1002     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 1003     var target = event.currentTarget;
4733 05 Apr 18 olle 1004
4733 05 Apr 18 olle 1005     var boxType = Data.get(target, 'boxtype');
4733 05 Apr 18 olle 1006     var index = Data.int(target, 'index');
4733 05 Apr 18 olle 1007
4733 05 Apr 18 olle 1008     // Get well position prefixes, default is for input tubes
4733 05 Apr 18 olle 1009     var boxPrefix = 'box.';
4733 05 Apr 18 olle 1010     var rowPrefix = 'row.';
4733 05 Apr 18 olle 1011     var columnPrefix = 'column.';
4733 05 Apr 18 olle 1012     if (boxType && boxType == 'DNA')
4733 05 Apr 18 olle 1013     {
4733 05 Apr 18 olle 1014       boxPrefix = 'dnaBox.';
4733 05 Apr 18 olle 1015       rowPrefix = 'dnaRow.';
4733 05 Apr 18 olle 1016       columnPrefix = 'dnaColumn.';
4733 05 Apr 18 olle 1017     }
4733 05 Apr 18 olle 1018     if (boxType && boxType == 'RNA')
4733 05 Apr 18 olle 1019     {
4733 05 Apr 18 olle 1020       boxPrefix = 'rnaBox.';
4733 05 Apr 18 olle 1021       rowPrefix = 'rnaRow.';
4733 05 Apr 18 olle 1022       columnPrefix = 'rnaColumn.';
4733 05 Apr 18 olle 1023     }
4733 05 Apr 18 olle 1024     var box = frm[boxPrefix+index].value;
4733 05 Apr 18 olle 1025     var row = frm[rowPrefix+index].value;
4733 05 Apr 18 olle 1026     var column = frm[columnPrefix+index].value;
4733 05 Apr 18 olle 1027     
4733 05 Apr 18 olle 1028     //wellIsValid[index] = true;
4733 05 Apr 18 olle 1029     if (!boxType || boxType == 'Specimen')
4733 05 Apr 18 olle 1030     {
4733 05 Apr 18 olle 1031       wellIsValid[index] = false;
4733 05 Apr 18 olle 1032     }
4733 05 Apr 18 olle 1033     else if (boxType && boxType == 'DNA')
4733 05 Apr 18 olle 1034     {
4733 05 Apr 18 olle 1035       dnaWellIsValid[index] = false;
4733 05 Apr 18 olle 1036     }
4733 05 Apr 18 olle 1037     else if (boxType && boxType == 'RNA')
4733 05 Apr 18 olle 1038     {
4733 05 Apr 18 olle 1039       rnaWellIsValid[index] = false;
4733 05 Apr 18 olle 1040     }
4733 05 Apr 18 olle 1041     else
4733 05 Apr 18 olle 1042     {
4733 05 Apr 18 olle 1043       wellIsValid[index] = false;
4733 05 Apr 18 olle 1044     }
4733 05 Apr 18 olle 1045     Wizard.setInputStatus(boxPrefix+index);
4733 05 Apr 18 olle 1046 /*
4733 05 Apr 18 olle 1047     Wizard.setInputStatus('position.'+index);
4733 05 Apr 18 olle 1048 */
4733 05 Apr 18 olle 1049     
4733 05 Apr 18 olle 1050     if (box == '') 
4733 05 Apr 18 olle 1051     {
4733 05 Apr 18 olle 1052       Wizard.setInputStatus(boxPrefix+index, 'invalid', 'Missing box');
4733 05 Apr 18 olle 1053       return;
4733 05 Apr 18 olle 1054     }
4733 05 Apr 18 olle 1055
4733 05 Apr 18 olle 1056     // Position errors are reported on box message line    
4733 05 Apr 18 olle 1057     if (row == '')
4733 05 Apr 18 olle 1058     {
4733 05 Apr 18 olle 1059       Wizard.setInputStatus(boxPrefix+index, 'invalid', 'Missing row');
4733 05 Apr 18 olle 1060       return;
4733 05 Apr 18 olle 1061     }
4733 05 Apr 18 olle 1062
4733 05 Apr 18 olle 1063     if (column == '')
4733 05 Apr 18 olle 1064     {
4733 05 Apr 18 olle 1065       Wizard.setInputStatus(boxPrefix+index, 'invalid', 'Missing column');
4733 05 Apr 18 olle 1066       return;
4733 05 Apr 18 olle 1067     }
4733 05 Apr 18 olle 1068     
4733 05 Apr 18 olle 1069     // Check for duplicates
4733 05 Apr 18 olle 1070     var nofTubes = parseInt(frm.nofTubes.value);
4733 05 Apr 18 olle 1071     for (var i=0; i < nofTubes; i++)
4733 05 Apr 18 olle 1072     {    
4733 05 Apr 18 olle 1073       if (i != index)
4733 05 Apr 18 olle 1074       {
4733 05 Apr 18 olle 1075         if (box == frm.elements[boxPrefix+i].value && row == frm[rowPrefix+i].value && column == frm[columnPrefix+i].value)
4733 05 Apr 18 olle 1076         {
4733 05 Apr 18 olle 1077           Wizard.setInputStatus(boxPrefix+index, 'invalid', 'The position is already used once in this wizard');        
4733 05 Apr 18 olle 1078           return;
4733 05 Apr 18 olle 1079         }
4733 05 Apr 18 olle 1080       }
4733 05 Apr 18 olle 1081     }
4733 05 Apr 18 olle 1082
4733 05 Apr 18 olle 1083     //Wizard.setInputStatus('position.'+index, 'checking', 'Checking...');
4733 05 Apr 18 olle 1084     Wizard.setInputStatus(boxPrefix+index, 'checking', 'Checking...');
4733 05 Apr 18 olle 1085     
4733 05 Apr 18 olle 1086     // Seems to be ok -- check if used by another sample
4733 05 Apr 18 olle 1087     var request = Ajax.getXmlHttpRequest();
4733 05 Apr 18 olle 1088     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 1089     url += '&cmd=ValidateWell';
4733 05 Apr 18 olle 1090     url += '&box=' + encodeURIComponent(box);  
4733 05 Apr 18 olle 1091     url += '&row=' + encodeURIComponent(row);
4733 05 Apr 18 olle 1092     url += '&column=' + encodeURIComponent(column);
4733 05 Apr 18 olle 1093     
4733 05 Apr 18 olle 1094     Wizard.asyncJsonRequest(url, function(response) { streg.onBoxValidated(response, boxType, index) } );
4733 05 Apr 18 olle 1095   }
4733 05 Apr 18 olle 1096   
4733 05 Apr 18 olle 1097   streg.onBoxValidated = function(response, boxType, index)
4733 05 Apr 18 olle 1098   {
4733 05 Apr 18 olle 1099     // Get well position prefixes, default is for input tubes
4733 05 Apr 18 olle 1100     var boxPrefix = 'box.';
4733 05 Apr 18 olle 1101     if (boxType && boxType == 'DNA')
4733 05 Apr 18 olle 1102     {
4733 05 Apr 18 olle 1103       boxPrefix = 'dnaBox.';
4733 05 Apr 18 olle 1104     }
4733 05 Apr 18 olle 1105     if (boxType && boxType == 'RNA')
4733 05 Apr 18 olle 1106     {
4733 05 Apr 18 olle 1107       boxPrefix = 'rnaBox.';
4733 05 Apr 18 olle 1108     }
4733 05 Apr 18 olle 1109
4733 05 Apr 18 olle 1110     //Wizard.setInputStatus('position.'+index);
4733 05 Apr 18 olle 1111     Wizard.setInputStatus(boxPrefix+index);
4733 05 Apr 18 olle 1112     if (response.message)
4733 05 Apr 18 olle 1113     {
4733 05 Apr 18 olle 1114       //Wizard.setInputStatus(response.box ? 'box.'+index : 'position.'+index, 'invalid', Strings.encodeTags(response.message));
4733 05 Apr 18 olle 1115       Wizard.setInputStatus(boxPrefix+index, 'invalid', Strings.encodeTags(response.message));
4733 05 Apr 18 olle 1116       return;
4733 05 Apr 18 olle 1117     }
4733 05 Apr 18 olle 1118     
4733 05 Apr 18 olle 1119     //wellIsValid[index] = true;
4733 05 Apr 18 olle 1120     if (!boxType || boxType == 'Specimen')
4733 05 Apr 18 olle 1121     {
4733 05 Apr 18 olle 1122       wellIsValid[index] = true;
4733 05 Apr 18 olle 1123     }
4733 05 Apr 18 olle 1124     else if (boxType && boxType == 'DNA')
4733 05 Apr 18 olle 1125     {
4733 05 Apr 18 olle 1126       dnaWellIsValid[index] = true;
4733 05 Apr 18 olle 1127     }
4733 05 Apr 18 olle 1128     else if (boxType && boxType == 'RNA')
4733 05 Apr 18 olle 1129     {
4733 05 Apr 18 olle 1130       rnaWellIsValid[index] = true;
4733 05 Apr 18 olle 1131     }
4733 05 Apr 18 olle 1132     else
4733 05 Apr 18 olle 1133     {
4733 05 Apr 18 olle 1134       wellIsValid[index] = true;
4733 05 Apr 18 olle 1135     }
4733 05 Apr 18 olle 1136     Wizard.setInputStatus(boxPrefix+index, 'valid');
4733 05 Apr 18 olle 1137 /*
4733 05 Apr 18 olle 1138     Wizard.setInputStatus('position.'+index, 'valid');
4733 05 Apr 18 olle 1139 */
4733 05 Apr 18 olle 1140   }
4733 05 Apr 18 olle 1141
4733 05 Apr 18 olle 1142   
4733 05 Apr 18 olle 1143   streg.nofSectionsOnChange = function(event)
4733 05 Apr 18 olle 1144   {
4733 05 Apr 18 olle 1145     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 1146     var target = event.currentTarget;
4733 05 Apr 18 olle 1147
4733 05 Apr 18 olle 1148     var index = Data.int(target, 'index');
4733 05 Apr 18 olle 1149     var nofSections = frm['nofSections.'+index].value;
4733 05 Apr 18 olle 1150
4733 05 Apr 18 olle 1151     Wizard.setInputStatus('nofSections.'+index);
4733 05 Apr 18 olle 1152
4733 05 Apr 18 olle 1153     if (nofSections == '')
4733 05 Apr 18 olle 1154     {
4733 05 Apr 18 olle 1155       Wizard.setInputStatus('nofSections'+index, 'invalid', 'Missing');
4733 05 Apr 18 olle 1156       return;
4733 05 Apr 18 olle 1157     }
4733 05 Apr 18 olle 1158     if (parseInt(nofSections) < 1)
4733 05 Apr 18 olle 1159     {
4733 05 Apr 18 olle 1160       Wizard.setInputStatus('nofSections'+index, 'invalid', 'Must be at least 1');
4733 05 Apr 18 olle 1161       return;    
4733 05 Apr 18 olle 1162     }
4733 05 Apr 18 olle 1163     Wizard.setInputStatus('nofSections'+index, 'valid');
4733 05 Apr 18 olle 1164   }
4733 05 Apr 18 olle 1165
4733 05 Apr 18 olle 1166   streg.validateStep3 = function(event)
4733 05 Apr 18 olle 1167   {
4733 05 Apr 18 olle 1168     var valid = false;
4733 05 Apr 18 olle 1169
4733 05 Apr 18 olle 1170     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 1171     var tubeContentType = frm.tubeContentType.value;
4733 05 Apr 18 olle 1172     if (tubeContentType == 'Specimen')
4733 05 Apr 18 olle 1173     {
4733 05 Apr 18 olle 1174       for (var i = 0; i < wellIsValid.length; i++)
4733 05 Apr 18 olle 1175       {
4733 05 Apr 18 olle 1176         // No storage space is allocated for first specimen,
4733 05 Apr 18 olle 1177         // since all amount is expected to be used for analysis.
4733 05 Apr 18 olle 1178         // Specimen tube with i == 0 is therefore skipped.
4733 05 Apr 18 olle 1179         if (i > 0)
4733 05 Apr 18 olle 1180         {
4733 05 Apr 18 olle 1181           if (!wellIsValid[i])
4733 05 Apr 18 olle 1182           {
4733 05 Apr 18 olle 1183             event.preventDefault();
4733 05 Apr 18 olle 1184             return;
4733 05 Apr 18 olle 1185           }
4733 05 Apr 18 olle 1186         }
4733 05 Apr 18 olle 1187         if (!dnaWellIsValid[i])
4733 05 Apr 18 olle 1188         {
4733 05 Apr 18 olle 1189           event.preventDefault();
4733 05 Apr 18 olle 1190           return;
4733 05 Apr 18 olle 1191         }
4733 05 Apr 18 olle 1192         if (!rnaWellIsValid[i])
4733 05 Apr 18 olle 1193         {
4733 05 Apr 18 olle 1194           event.preventDefault();
4733 05 Apr 18 olle 1195           return;
4733 05 Apr 18 olle 1196         }
4733 05 Apr 18 olle 1197       }
4733 05 Apr 18 olle 1198     }
4733 05 Apr 18 olle 1199     else
4733 05 Apr 18 olle 1200     {
4733 05 Apr 18 olle 1201       // Input DNA, RNA, or DNA + RNA
4733 05 Apr 18 olle 1202       for (var i = 0; i < wellIsValid.length; i++)
4733 05 Apr 18 olle 1203       {
4733 05 Apr 18 olle 1204         if (!wellIsValid[i])
4733 05 Apr 18 olle 1205         {
4733 05 Apr 18 olle 1206           event.preventDefault();
4733 05 Apr 18 olle 1207           return;
4733 05 Apr 18 olle 1208         }
4733 05 Apr 18 olle 1209       }
4733 05 Apr 18 olle 1210     }
4733 05 Apr 18 olle 1211   }
4733 05 Apr 18 olle 1212
4733 05 Apr 18 olle 1213   
4733 05 Apr 18 olle 1214   streg.submit = function()
4733 05 Apr 18 olle 1215   {
4733 05 Apr 18 olle 1216     var frm = document.forms['meludi'];
4733 05 Apr 18 olle 1217
4733 05 Apr 18 olle 1218     caseInfo.pad = frm.pad.value;
4733 05 Apr 18 olle 1219     caseInfo.arrivalDate = Strings.trim(frm.arrivalDate.value);
4733 05 Apr 18 olle 1220     caseInfo.samplingDate = Strings.trim(frm.samplingDate.value);
4779 20 Apr 18 olle 1221 /*
4733 05 Apr 18 olle 1222     caseInfo.mutationAnalysisKras = frm.mutationAnalysisKras.checked;
4733 05 Apr 18 olle 1223     caseInfo.mutationAnalysisNras = frm.mutationAnalysisNras.checked;
4733 05 Apr 18 olle 1224     caseInfo.mutationAnalysisBraf = frm.mutationAnalysisBraf.checked;
4733 05 Apr 18 olle 1225     caseInfo.mutationAnalysisEgfr = frm.mutationAnalysisEgfr.checked;
4733 05 Apr 18 olle 1226     caseInfo.mutationAnalysisAlkEml4 = frm.mutationAnalysisAlkEml4.checked;
4733 05 Apr 18 olle 1227     caseInfo.mutationAnalysisPdgfra = frm.mutationAnalysisPdgfra.checked;
4733 05 Apr 18 olle 1228     caseInfo.mutationAnalysisKit = frm.mutationAnalysisKit.checked;
4779 20 Apr 18 olle 1229 */
4733 05 Apr 18 olle 1230     caseInfo.mutationAnalysisTst170 = frm.mutationAnalysisTst170.checked;
4733 05 Apr 18 olle 1231     caseInfo.mutationAnalysisOther = frm.mutationAnalysisOther.checked;
4733 05 Apr 18 olle 1232     caseInfo.site = frm.site.value;
4733 05 Apr 18 olle 1233     caseInfo.tubeContentType = frm.tubeContentType.value;
4733 05 Apr 18 olle 1234     caseInfo.specimenType = frm.specimenType.value;
4733 05 Apr 18 olle 1235     caseInfo.specimenInputType = frm.specimenInputType.value;
4733 05 Apr 18 olle 1236     caseInfo.projectFocus = frm.projectFocus.value;
4733 05 Apr 18 olle 1237     caseInfo.metastasisSite = frm.metastasisSite.value;
4733 05 Apr 18 olle 1238     caseInfo.viableTumourCellsPercent = frm.viableTumourCellsPercent.value;
4733 05 Apr 18 olle 1239     caseInfo.otherPathNote = frm.otherPathNote.value;
4733 05 Apr 18 olle 1240     caseInfo.extractsFromFirstSpecimenOnly = frm.extractsFromFirstSpecimenOnlyCB.checked;
4733 05 Apr 18 olle 1241     
4733 05 Apr 18 olle 1242     var nofTubes = parseInt(frm.nofTubes.value);
4733 05 Apr 18 olle 1243     caseInfo.specimen = [];
4733 05 Apr 18 olle 1244     for (var i = 0; i < nofTubes; i++)
4733 05 Apr 18 olle 1245     {
4733 05 Apr 18 olle 1246       var specimenTube ={};
4733 05 Apr 18 olle 1247       specimenTube.name = streg.fetchTubeName(caseInfo.tubeContentType, caseInfo, i);
4733 05 Apr 18 olle 1248       specimenTube.box = frm['box.'+i].value;
4733 05 Apr 18 olle 1249       specimenTube.row = frm['row.'+i].value;
4733 05 Apr 18 olle 1250       specimenTube.column = frm['column.'+i].value;
4733 05 Apr 18 olle 1251       var nofSections = null;
4733 05 Apr 18 olle 1252       if (caseInfo.tubeContentType == 'Specimen')
4733 05 Apr 18 olle 1253       {
4733 05 Apr 18 olle 1254         if (i == 0 || !caseInfo.extractsFromFirstSpecimenOnly)
4733 05 Apr 18 olle 1255         {
4733 05 Apr 18 olle 1256           // Storage position for DNA extract from specimen
4733 05 Apr 18 olle 1257           specimenTube.dnaBox = frm['dnaBox.'+i].value;
4733 05 Apr 18 olle 1258           specimenTube.dnaRow = frm['dnaRow.'+i].value;
4733 05 Apr 18 olle 1259           specimenTube.dnaColumn = frm['dnaColumn.'+i].value;
4733 05 Apr 18 olle 1260
4733 05 Apr 18 olle 1261           // Storage position for RNA extract from specimen        
4733 05 Apr 18 olle 1262           specimenTube.rnaBox = frm['rnaBox.'+i].value;
4733 05 Apr 18 olle 1263           specimenTube.rnaRow = frm['rnaRow.'+i].value;
4733 05 Apr 18 olle 1264           specimenTube.rnaColumn = frm['rnaColumn.'+i].value;
4733 05 Apr 18 olle 1265         }
4733 05 Apr 18 olle 1266         
4733 05 Apr 18 olle 1267         nofSections = frm['nofSections.'+i].value;
4733 05 Apr 18 olle 1268       }
4733 05 Apr 18 olle 1269       specimenTube.nofSections = nofSections;
4733 05 Apr 18 olle 1270       specimenTube.comment = frm['comment.'+i].value;
4733 05 Apr 18 olle 1271       specimenTube.specimenType = frm.specimenType.value;
4733 05 Apr 18 olle 1272       specimenTube.specimenInputType = frm.specimenInputType.value;
4733 05 Apr 18 olle 1273       caseInfo.specimen[i] = specimenTube;
4733 05 Apr 18 olle 1274     }
4733 05 Apr 18 olle 1275
4733 05 Apr 18 olle 1276     var submitInfo = {};
4733 05 Apr 18 olle 1277     submitInfo.caseInfo = caseInfo;
4733 05 Apr 18 olle 1278
4733 05 Apr 18 olle 1279     var url = '../SpecimenTubeRegistration.servlet?ID='+App.getSessionId();
4733 05 Apr 18 olle 1280     url += '&cmd=CreateSpecimenTubes';
4733 05 Apr 18 olle 1281     Wizard.showLoadingAnimation('Performing registration...');
4733 05 Apr 18 olle 1282     Wizard.asyncJsonRequest(url, streg.submissionResults, 'POST', JSON.stringify(submitInfo));
4733 05 Apr 18 olle 1283   }
4733 05 Apr 18 olle 1284   
4733 05 Apr 18 olle 1285   streg.submissionResults = function(response)
4733 05 Apr 18 olle 1286   {
4733 05 Apr 18 olle 1287     Wizard.showFinalMessage(response.messages);
4733 05 Apr 18 olle 1288     Doc.show('gorestart');
4733 05 Apr 18 olle 1289     Doc.show('gonext-message');
4733 05 Apr 18 olle 1290   }
4733 05 Apr 18 olle 1291
4733 05 Apr 18 olle 1292   streg.countDownToRestart = function()
4733 05 Apr 18 olle 1293   {
4733 05 Apr 18 olle 1294     var time = restartAt - (new Date()).getTime();
4733 05 Apr 18 olle 1295     if (time < 0)
4733 05 Apr 18 olle 1296     {
4733 05 Apr 18 olle 1297       Wizard.restartWizard();
4733 05 Apr 18 olle 1298     }
4733 05 Apr 18 olle 1299     else
4733 05 Apr 18 olle 1300     {
4733 05 Apr 18 olle 1301       Doc.element('gonext-message').innerHTML = '<i>Wizard will restart automatically in ' + Math.ceil(time/1000) + ' seconds...</i>';
4733 05 Apr 18 olle 1302     }
4733 05 Apr 18 olle 1303   }
4733 05 Apr 18 olle 1304   
4733 05 Apr 18 olle 1305   streg.stopAutoRestart = function()
4733 05 Apr 18 olle 1306   {
4733 05 Apr 18 olle 1307     clearTimeout(restartTimer);
4733 05 Apr 18 olle 1308     Doc.hide('gonext-message');
4733 05 Apr 18 olle 1309     Doc.hide('gostop');
4733 05 Apr 18 olle 1310   }
4733 05 Apr 18 olle 1311
4733 05 Apr 18 olle 1312   streg.getCheckboxStatus = function(checkbox)
4733 05 Apr 18 olle 1313   {
4733 05 Apr 18 olle 1314     return checkbox.checked;
4733 05 Apr 18 olle 1315   }
4733 05 Apr 18 olle 1316   
4733 05 Apr 18 olle 1317   return streg;
4733 05 Apr 18 olle 1318 }();
4733 05 Apr 18 olle 1319
4733 05 Apr 18 olle 1320 Doc.onLoad(SpecimenTubeReg.initPage);
4733 05 Apr 18 olle 1321