source: extensions/net.sf.basedb.reggie/trunk/resources/specimentube.jsp @ 1400

Last change on this file since 1400 was 1400, checked in by Martin Svensson, 11 years ago

References #317. Updated the functionality when selecting box and position to store the specimen tube in. Reggie now remember the box that was used the time before and it also suggest which position to choose depending on free positions in the corresponding lys-box. Operator comment field was renamed to Operator delivery comment.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 35.4 KB
Line 
1<%@ page
2  pageEncoding="UTF-8"
3  session="false"
4  import="net.sf.basedb.core.User"
5  import="net.sf.basedb.core.BioPlate"
6  import="net.sf.basedb.core.DbControl" 
7  import="net.sf.basedb.core.Item"
8  import="net.sf.basedb.core.ItemContext"
9  import="net.sf.basedb.core.SessionControl"
10  import="net.sf.basedb.clients.web.Base" 
11  import="net.sf.basedb.util.Values"
12  import="java.util.List"
13%>
14<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
15<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
16<%
17final SessionControl sc = Base.getExistingSessionControl(request, true);
18final String ID = sc.getId();
19final float scale = Base.getScale(sc);
20DbControl dc = null;
21try
22{
23  dc = sc.newDbControl();
24  final User user = User.getById(dc, sc.getLoggedInUserId());
25  final ItemContext cc = Base.getAndSetCurrentContext(sc, Item.SAMPLE, null, null);
26  final List<BioPlate> recentBoxes = (List<BioPlate>)cc.getRecent(dc, Item.BIOPLATE, "reggie_specimentube");
27  BioPlate recentBox = null;
28  String recentBoxName = ""; 
29  if (recentBoxes.size() > 0)
30  {
31    recentBox = recentBoxes.get(0);
32    int lastRow = recentBox.getRows()-1;
33    int lastColumn = recentBox.getColumns()-1;
34    // Move on to next box in order if the last position isn't empty.
35    if (!recentBox.getBioWell(lastRow, lastColumn).isEmpty())
36    {
37      Integer currentBoxNumber = Values.getInteger(recentBox.getName().substring(2), null);
38      if (currentBoxNumber != null)
39      {
40        currentBoxNumber++;
41        String nameString = ""+currentBoxNumber;       
42        while(nameString.length() < 3)
43        {
44          nameString = "0"+nameString;
45        }
46        recentBoxName = "Sp"+nameString;       
47      }     
48    }
49    else
50    {
51      recentBoxName = recentBox.getName();
52    }
53  }
54%>
55<base:page type="default" >
56<base:head scripts="ajax.js" styles="path.css">
57  <link rel="stylesheet" type="text/css" href="reggie.css">
58  <script language="JavaScript" src="reggie.js" type="text/javascript" charset="UTF-8"></script>
59 
60 
61<script language="JavaScript">
62var caseIsValid = false;
63var arrivalDateIsValid = true;
64var nofTubesIsValid = false;
65var lateralityIsValid = false;
66var boxesAreValid = null;
67var wellsAreValidValid = null;
68var specimenTypeIsValid = false;
69var samplingDateIsValid = true;
70var rnaLaterDateIsValid = true;
71var debug = false;
72var currentStep = 1;
73var usedBox = '';
74
75var caseInfo = null;
76var boxInfo = null;
77var updateMode = null;
78
79function init()
80{
81  var frm = document.forms['reggie'];
82  frm.caseName.focus();
83}
84
85function goNext()
86{
87  setInnerHTML('gonext.message', '');
88  if (currentStep == 1)
89  {   
90    gotoStep2();
91  }
92  else if (currentStep == 2)
93  {
94    if (step2IsValid()) gotoStep3();
95  }
96}
97
98function step2IsValid()
99{
100  var frm = document.forms['reggie'];
101  if (!nofTubesIsValid)
102  {
103    frm.nofTubes.focus();
104    return false;
105  }
106  if (!arrivalDateIsValid)
107  {
108    frm.arrivalDate.focus();
109    return false;
110  }
111  if (!samplingDateIsValid)
112  {
113    frm.samplingDate.focus();
114    return false;
115  }
116  if (!rnaLaterDateIsValid)
117  {
118    frm.rnaLaterDate.focus();
119    return false;
120  }
121  if (!lateralityIsValid) return false;
122  return true;
123}
124
125function gotoStep2()
126{
127  var frm = document.forms['reggie'];
128  var caseName = frm.caseName.value;
129  if (caseName == '')
130  {
131    setInputStatus('case', 'Missing', 'invalid');
132    return;
133  }
134  setInputStatus('case', '', 'valid');
135 
136  getCaseInfo();
137 
138  var hasSpecimen = caseInfo.specimen && caseInfo.specimen.length > 0; 
139  var hasLeftSpecimen = false;
140  var hasRightSpecimen = false;
141  var hasUnknownSpecimen = false;
142  var thisArrivalDate = null;
143  var thisNumberOfTubes = null;
144  var thisCaseSamplingDate = null;
145  var thisCaseRNALaterDate = null;
146  var thisCaseLaterality = null;
147  var thisCasePad = null;
148  var thisOtherPathNote = null;
149  var thisSpecimenType = null;
150  var thisBiopsyType = null;
151
152  frm.caseName.disabled = true;
153   
154  Main.show('gocancel');
155  Main.show('caseSection');
156
157  var hasLeftCase = false;
158  var hasRightCase = false;
159  var hasUnknownCase = false;
160 
161  // Load annotations from the actual case
162  thisCaseLaterality = caseInfo.laterality;
163  thisOtherPathNote = caseInfo.otherPathNote;
164  thisCasePad = caseInfo.pad;
165  if (caseInfo.reasonIfNoSpecimen && caseInfo.reasonIfNoSpecimen.length>0)
166  {
167    setFatalError("There is a reason given why this case doesn't have specimen tubes. " +
168        "This wizard can't be used until that is corrected.");
169  }
170 
171  //Adjust the step-title
172  if (caseInfo.id)
173  {
174    setInnerHTML('step2.title', 'Add Specimen tube Information');
175  }
176  if (hasSpecimen)
177  {
178    setInnerHTML('step2.title', 'Update Case Information');
179    updateMode = true;   
180    frm.nofTubes.value = thisNumberOfTubes;
181    frm.nofTubes.disabled = true;
182    frm.arrivalDate.focus();
183
184    // If the number of tubes not is set - use the current number of specimen tubes.
185    if (!thisNumberOfTubes) thisNumberOfTubes = caseInfo.specimen.length;
186       
187    for (var i=0; i < caseInfo.specimen.length; i++)
188    {
189      var specimen = caseInfo.specimen[i];       
190      if (specimen.pad && !thisCasePad)
191      {         
192        thisCasePad = specimen.pad;
193      }     
194      if(specimen.arrivalDate && !thisArrivalDate)
195      {         
196        thisArrivalDate = specimen.arrivalDate;
197      }
198      if (specimen.nofTubes && !thisNumberOfTubes)
199      {
200        thisNumberOfTubes = specimen.nofTubes;
201      }
202      if (specimen.samplingDate && !thisCaseSamplingDate) 
203      {
204        thisCaseSamplingDate = specimen.samplingDate;
205      }
206      if (specimen.rnaLaterDate && !thisCaseRNALaterDate) 
207      {
208        thisCaseRNALaterDate = specimen.rnaLaterDate;
209      }
210      if (specimen.otherPathNote && !thisOtherPathNote)
211      {
212        thisOtherPathNote = specimen.otherPathNote;
213      }
214      if (specimen.laterality && !thisCaseLaterality) 
215      {
216        if (specimen.laterality == 'LEFT') hasLeftSpecimen = true;
217        if (specimen.laterality == 'RIGHT') hasRightSpecimen = true;
218        thisCaseLaterality = specimen.laterality;
219      }     
220      else if(!thisCaseLaterality)
221      {
222        hasUnknownSpecimen = true;
223      }
224      if (specimen.specimenType && !thisSpecimenType)
225      {
226        thisSpecimenType = specimen.specimenType;
227      }
228      if (specimen.biopsyType && !thisBiopsyType)
229      {
230        thisBiopsyType = specimen.biopsyType;
231      }     
232    }
233             
234    // Check that all specimen tubes have the same laterality
235    var numLateralities = 0;
236    if (hasLeftSpecimen) numLateralities++;
237    if (hasRightSpecimen) numLateralities++;
238    if (hasUnknownSpecimen) numLateralities++;     
239    if (numLateralities > 1)
240    {
241      setInputStatus('laterality', 'Specimen tubes with different laterality', 'warning');
242      thisCaseLaterality = null;
243      Forms.checkRadio(frm.laterality, thisCaseLaterality);       
244    }   
245  }
246  if (thisCaseLaterality != null)
247  {
248    var lateralityInput = '';
249    lateralityInput += '<input type="radio" name="laterality" value="LEFT" ';
250    if (thisCaseLaterality == 'LEFT') lateralityInput += 'checked';
251    lateralityInput += ' onChange="lateralityOnChange()">LEFT';
252    lateralityInput += '<br>';
253    lateralityInput += '<input type="radio" name="laterality" value="RIGHT" ';
254    if (thisCaseLaterality == 'RIGHT') lateralityInput += 'checked';
255    lateralityInput += ' onChange="lateralityOnChange()">RIGHT';
256    setInnerHTML('laterality.input', lateralityInput);                 
257  }
258  lateralityOnChange();
259  specimenTypeOnClick();
260  biopsyTypeOnClick();
261  if (thisCasePad != null)
262  {
263    frm.pad.value = thisCasePad;
264    padOnChange();
265  }
266  if (thisArrivalDate != null)
267  {
268    frm.arrivalDate.value = thisArrivalDate;
269  }
270  if (thisNumberOfTubes != null)
271  {
272    frm.nofTubes.value = thisNumberOfTubes;
273    nofTubesOnChange();
274  }
275  if (thisCaseSamplingDate != null)
276  {
277    frm.samplingDate.value = thisCaseSamplingDate.substring(0, 8);
278    frm.samplingTime.value = thisCaseSamplingDate.substring(9, 13);
279    samplingDateTimeOnChange();
280  }
281  if (thisCaseRNALaterDate != null)
282  {
283    frm.rnaLaterDate.value = thisCaseRNALaterDate.substring(0, 8);
284    frm.rnaLaterTime.value = thisCaseRNALaterDate.substring(9, 13);
285    rnaLaterDateTimeOnChange();
286  }
287  if (thisOtherPathNote != null)
288  {
289    frm.otherPathNote.value = thisOtherPathNote;
290  }
291  if (thisSpecimenType != null)
292  {
293    Forms.selectListOption(frm.specimenType, thisSpecimenType);
294    specimenTypeOnClick();
295  }
296  if (thisBiopsyType != null)
297  {
298    Forms.selectListOption(frm.biopsyType, thisBiopsyType);
299    biopsyTypeOnClick();
300  }
301  frm.nofTubes.focus();
302  currentStep = 2;   
303}
304
305function gotoStep3()
306{
307  var frm = document.forms['reggie'];
308  var inputTubeHtml = '';
309  var nofTubes = frm.nofTubes.value;
310  boxInfo = Array(nofTubes);
311 
312  frm.arrivalDate.disabled = true;
313  frm.nofTubes.disabled = true;
314  frm.pad.disabled = true;
315  for (var i=0;i<frm.laterality.length;i++)
316  {
317    frm.laterality[i].disabled = true;
318  }
319  frm.rnaLaterDate.disabled = true;
320  frm.samplingDate.disabled = true;
321  frm.rnaLaterTime.disabled = true;
322  frm.samplingTime.disabled = true;
323  frm.otherPathNote.disabled = true;
324  frm.specimenType.disabled = true;
325  frm.biopsyType.disabled = true;
326 
327  if (updateMode)
328  {
329    //setInnerHTML('step3.title', 'Update Tube Information');
330  }
331
332  for (var i=0;i<nofTubes;i++)
333  {
334    var specimen = null;
335    var boxValue = '<%=recentBoxName %>';
336    var rowValue = '';
337    var columnValue = '';
338    var spWeightValue = '';
339    var hisWeightValue = '';
340    var allPrepWeightValue = '';
341
342    boxInfo[i] = null;
343    var boxDisabled = '';
344    if (caseInfo.specimen && caseInfo.specimen.length>0 && i<caseInfo.specimen.length)
345    {
346      boxDisabled = 'disabled';
347      specimen = caseInfo.specimen[i];
348      boxValue = specimen.box == null ? '' : specimen.box;
349      rowValue = specimen.row == null ? '' : specimen.row;
350      columnValue = specimen.column == null ? '' : specimen.column;     
351    }
352    inputTubeHtml += '<tr>';
353    inputTubeHtml += '<td class="prompt">Specimen Tube '+caseInfo.name+'.'+(i+1)+'</td>';
354    inputTubeHtml += '</tr>';
355
356    var box = 'box'+i;   
357    inputTubeHtml += '<tr>';
358    inputTubeHtml += '<td class="subprompt">Box</td>';
359    inputTubeHtml += '<td class="input">';
360    inputTubeHtml += '<input type="text" name='+box+' value="' + boxValue + '" '+ boxDisabled +' size="12" maxlength="12" onKeyUp="boxOnKeyUp('+i+')" onBlur="boxOnChange('+i+')"></td>';
361    inputTubeHtml += '<td class="status" id="'+box+'.status"></td>';
362    inputTubeHtml += '<td class="help"><span id="'+box+'.message" class="message" style="display: none;"></span>Box-number where the specimen tube is located in.</td>';   
363    inputTubeHtml += '</tr>';       
364
365    var row = 'row'+i;
366    var column = 'column'+i;
367    var wellDisabled = rowValue != '' || boxValue == '' ? 'disabled' : '';
368    inputTubeHtml += '<tr>';
369    inputTubeHtml += '<td class="subprompt">Row</td>';
370    inputTubeHtml += '<td class="input"><input style="text-transform:uppercase;" type="text" onKeyPress="" name='+row+' value="' + rowValue + '" size="3" maxlength="2" ' + wellDisabled;
371    inputTubeHtml += ' onBlur="wellOnChange('+i+')">';
372    inputTubeHtml += '&nbsp;Column<input type="text" name='+column+' value="'+ columnValue + '" size="3" maxlength="3" ' + wellDisabled;
373    inputTubeHtml += ' onBlur="wellOnChange('+i+')">';
374    inputTubeHtml += '&nbsp;<a href="javascript:suggestWellOnClick('+i+')" disabled>Suggest</a>'
375    inputTubeHtml += '</td>';
376    inputTubeHtml += '<td class="status" id="rowColumn'+i+'.status"></td>';
377    inputTubeHtml += '<td class="help"><span id="rowColumn'+i+'.message" class="message" style="display: none;"></span></td>';   
378    inputTubeHtml += '</tr>';
379
380    var operatorComment = 'operatorComment'+i;
381    var doOnTab = i==(nofTubes-1) ? 'doOnTab(event, goCreate)' : '';
382    inputTubeHtml += '<tr>';
383    inputTubeHtml += '<td class="subprompt">Operator delivery comment</td>';
384    inputTubeHtml += '<td class="input"><textarea rows="3" cols="30" name='+operatorComment+' value="" onkeypress="'+doOnTab+'"></textarea></td>';
385    inputTubeHtml += '<td class="status" id="'+operatorComment+'.status"></td>';
386    inputTubeHtml += '<td class="help"><span id="'+operatorComment+'.message" class="message" style="display: none;"></span>Operator delivery comment</td>';   
387    inputTubeHtml += '</tr>';
388  }
389  setInnerHTML('tubeInputs', inputTubeHtml); 
390  boxesAreValid = Array(nofTubes);
391  wellsAreValid = Array(nofTubes);
392  currentStep = 3;
393  Main.show('tubeSection');
394  Main.hide('gonext'); 
395
396  if (updateMode) Main.show('goupdate');
397  else Main.show('gocreate');
398
399  var textLength = frm.box0.value.length;
400  frm.box0.focus();
401  frm.box0.setSelectionRange(textLength,textLength);
402}
403
404function samplingDateTimeOnChange()
405{
406  var frm = document.forms['reggie'];
407  var todaysDate = new Date();
408  samplingDateIsValid = false;
409  setInputStatus('samplingDate', '', '');
410 
411  var samplingDate = frm.samplingDate.value;
412  var samplingTime = frm.samplingTime.value;
413 
414  if (samplingDate != '' || samplingTime != '')
415  {
416    // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
417    samplingDate = autoFillDate(samplingDate);
418    frm.samplingDate.value = samplingDate;
419
420    samplingTime = autoFillTime(samplingTime);
421    frm.samplingTime.value = samplingTime;
422   
423    if (!Dates.isDate(samplingDate, 'yyyyMMdd'))
424    {
425      setInputStatus('samplingDate', 'Not a valid date', 'invalid');
426      return;
427    }   
428    if (todaysDate < new Date(samplingDate.substring(0,4),new Number(samplingDate.substring(4,6)-1), samplingDate.substring(6)) )
429    {
430      setInputStatus('samplingDate', 'Future date is not valid', 'invalid');
431      return;
432    }
433    if (frm.rnaLaterDate.value == '') frm.rnaLaterDate.value = samplingDate;
434   
435    if (!Dates.isDate(samplingDate + ' ' + samplingTime, 'yyyyMMdd HHmm'))
436    {
437      if (samplingDate != '') setInputStatus('samplingDate', 'Not a valid time', 'invalid');
438      return;
439    }
440    setInputStatus('samplingDate', '', 'valid');
441  }
442  samplingDateIsValid = true;
443  rnaLaterDateTimeOnChange();
444}
445
446function boxOnKeyUp(tubeIndex)
447{
448  var frm = document.forms['reggie'];
449  var boxName = 'box'+tubeIndex;
450  var boxValue = frm.elements[boxName].value;
451  if (boxValue.length>0 && boxValue.substring(0,2) != 'Sp')
452  {
453    boxValue = 'Sp'+boxValue;
454  }
455  frm.elements[boxName].value = boxValue;
456}
457
458function boxOnChange(tubeIndex)
459{
460  var frm = document.forms['reggie'];
461  var boxName = 'box'+tubeIndex;
462  var rowName = 'row'+tubeIndex;
463  var columnName = 'column'+tubeIndex; 
464  var boxValue = frm.elements[boxName].value;
465  var nofTubes = frm.nofTubes.value;
466 
467  boxValue = boxValue.substring(2);
468  while (boxValue.length > 0 && boxValue.length < 3)
469  {   
470    boxValue = '0'+boxValue;
471  }
472  if (boxValue.length > 0)
473  {
474    boxValue = 'Sp'+boxValue;
475  }
476  frm.elements[boxName].value = boxValue;
477 
478  wellsAreValid[tubeIndex] = false;
479 
480  if (frm.elements[boxName].value == 'Sp' || frm.elements[boxName].value == '')
481  {
482    boxesAreValid[tubeIndex] = true;
483    wellsAreValid[tubeIndex] = true;
484    frm.elements[rowName].disabled = true;
485    frm.elements[rowName].value = '';
486    frm.elements[columnName].disabled = true;
487    frm.elements[columnName].value = '';   
488    setInputStatus(boxName, '', ''); 
489    setInputStatus('rowColumn'+tubeIndex, '', '');       
490    return false;
491  }
492   
493  var request = Ajax.getXmlHttpRequest();
494  var url = 'SpecimenTubeRegistration.servlet?ID=<%=ID%>&cmd=GetBoxInfo';
495  url += '&boxName=' + boxValue; 
496  url += '&nofTubes=' + nofTubes;
497  request.open("GET", url, false);
498  request.send(null);
499
500  if (debug) Main.debug(request.responseText);
501
502  var response = JSON.parse(request.responseText);
503  if (response.status != 'ok')
504  {
505    boxesAreValid[tubeIndex] = false;   
506    setFatalError(response.message);
507    return false;
508  }
509  if (!response.boxInfo)
510  {
511    boxesAreValid[tubeIndex] = false;
512    setInputStatus(boxName, response.message, 'invalid');   
513    frm.elements[rowName].value = '';
514    frm.elements[columnName].value = '';
515    frm.elements[rowName].disabled = true;
516    frm.elements[columnName].disabled = true;
517    return false;
518  }   
519  else
520  {
521    setInputStatus('rowColumn'+tubeIndex,'Row[A-'+response.rows+'], Columns[1-'+response.columns+']','');
522    boxesAreValid[tubeIndex] = true;
523    boxInfo[tubeIndex] = response.boxInfo; 
524    frm.elements[rowName].disabled = false;
525    frm.elements[columnName].disabled = false;
526   
527    var nextWellRow = '';
528    var nextWellColumn = '';
529   
530    if (tubeIndex==0)
531    {
532      usedBox = boxValue;     
533    }
534   
535    if (usedBox != boxValue)
536    {     
537      setInputStatus(boxName, 'More then one box is used','warning');
538      frm.elements[rowName].focus();
539      return;
540    }
541   
542    if (response.freeRow != null && response.freeColumn != null)
543    {
544      nextWellRow = response.freeRow;
545      nextWellColumn = parseInt(response.freeColumn)+1;   
546     
547      nextWellColumn = nextWellColumn + tubeIndex;
548     
549      if (frm.elements[rowName].value == '' && 
550          frm.elements[columnName].value == '')
551      {
552        frm.elements[rowName].value = nextWellRow;   
553        frm.elements[columnName].value = nextWellColumn;
554      }
555    }         
556    setInputStatus('rowColumn'+tubeIndex,'Row[A-'+response.rows+'], Columns[1-'+response.columns+']','');
557    if (response.message && "Warning:" == response.message.substring(0,8))
558    {
559      setInputStatus(boxName, response.message.substring(8), 'warning');
560    }
561    else
562    {
563      setInputStatus(boxName, '', 'valid');
564    }       
565    frm.elements[rowName].focus();   
566  }   
567}
568
569function wellOnChange(tubeIndex)
570{
571  var frm = document.forms['reggie'];
572  var boxName = 'box'+tubeIndex;
573  var rowName = 'row'+tubeIndex;
574  var columnName = 'column'+tubeIndex;
575  var rowValue = frm.elements[rowName].value;
576  var columnValue = frm.elements[columnName].value
577  var boxValue = frm.elements[boxName].value;
578  var nofTubes = frm.nofTubes.value;
579 
580  if (boxValue != '' && 
581      (rowValue == '' || columnValue == ''))
582  {
583    wellsAreValid[tubeIndex] = false;
584    setInputStatus('rowColumn'+tubeIndex, 'Row or column cannot be empty when the box is specified.', 'invalid');
585    return false;
586  }
587 
588  var request = Ajax.getXmlHttpRequest();
589  var url = 'SpecimenTubeRegistration.servlet?ID=<%=ID%>&cmd=ValidateWell';
590  url += '&boxId=' + boxInfo[tubeIndex]; 
591  url += '&row=' + rowValue;
592  url += '&column=' + columnValue;
593  request.open("GET", url, false);
594  request.send(null);
595
596  if (debug) Main.debug(request.responseText);
597
598  var response = JSON.parse(request.responseText);
599  if (response.status != 'ok')
600  {
601    wellsAreValid[tubeIndex] = false;
602    setFatalError(response.message);
603    return false;
604  }
605  if (response.message)
606  {
607    if (response.message.length>8 && response.message.substring(0,8) == "Warning:")
608    {
609      setInputStatus('rowColumn'+tubeIndex, response.message.substring(8), 'warning');
610    }
611    else
612    {
613      wellsAreValid[tubeIndex] = false;
614      setInputStatus('rowColumn'+tubeIndex, response.message, 'invalid')
615      return false;
616    }   
617  }
618  for (var i=0;i<nofTubes;i++)
619  {   
620    if (i != tubeIndex && frm.elements['box'+i].value == boxValue)
621    {
622      if (rowValue == frm.elements['row'+i].value && 
623          columnValue == frm.elements['column'+i].value)
624      {
625        wellsAreValid[tubeIndex] = false;
626        setInputStatus('rowColumn'+tubeIndex, 'The row and column are already used once in this wizard','invalid');       
627        return false;
628      }
629    }
630  }
631  wellsAreValid[tubeIndex] = true;
632  setInputStatus('rowColumn'+tubeIndex, '', 'valid');
633}
634
635function suggestWellOnClick(tubeIndex)
636{
637  var frm = document.forms['reggie'];
638  var boxName = 'box'+tubeIndex;
639  var boxValue = frm.elements[boxName].value;
640  var rowName = 'row'+tubeIndex;
641  var columnName = 'column'+tubeIndex;
642  var nextWellRow = '';
643  var nextWellColumn = '';
644  var nofTubes = frm.nofTubes.value;
645 
646  if (boxValue && boxValue != 'Sp')
647  {
648    var request = Ajax.getXmlHttpRequest();
649    var url = 'SpecimenTubeRegistration.servlet?ID=<%=ID%>&cmd=GetBoxInfo';
650    url += '&boxName=' + boxValue; 
651    url += '&nofTubes=' + nofTubes;
652    request.open("GET", url, false);
653    request.send(null);
654
655    if (debug) Main.debug(request.responseText);
656
657    var response = JSON.parse(request.responseText);
658    if (response.status != 'ok')
659    {
660      boxesAreValid[tubeIndex] = false;   
661      setFatalError(response.message);
662      return false;
663    }
664    if (response.boxInfo)
665    {
666      if (response.freeRow && response.freeColumn)
667      {
668        nextWellRow = response.freeRow;
669        nextWellColumn = parseInt(response.freeColumn)+1;
670        if( (nextWellColumn + tubeIndex) > response.columns)
671        {
672          nextWellColumn = 0;
673          nextWellRow = '';
674        }
675        else
676        {
677          nextWellColumn = nextWellColumn + tubeIndex;
678        }
679        frm.elements[rowName].value = nextWellRow;   
680        frm.elements[columnName].value = nextWellColumn;
681      }     
682    }
683    wellOnChange(tubeIndex);
684    frm.elements['operatorComment'+tubeIndex].focus();
685  }
686}
687
688function rnaLaterDateTimeOnChange()
689{
690  var frm = document.forms['reggie'];
691  var todaysDate = new Date();
692  rnaLaterDateIsValid = false;
693  setInputStatus('rnaLaterDate', '', '');
694 
695  var rnaLaterDate = frm.rnaLaterDate.value;
696  var rnaLaterTime = frm.rnaLaterTime.value;
697  var rnaLaterTimestamp;
698 
699  if (rnaLaterDate != '' || rnaLaterTime != '')
700  {
701    // Auto-fill the date if it's not given in yyyyMMdd
702    rnaLaterDate = autoFillDate(rnaLaterDate);
703    frm.rnaLaterDate.value = rnaLaterDate;
704
705    rnaLaterTime = autoFillTime(rnaLaterTime);
706    frm.rnaLaterTime.value = rnaLaterTime;
707   
708    if (!Dates.isDate(rnaLaterDate, 'yyyyMMdd'))
709    {
710      setInputStatus('rnaLaterDate', 'Not a valid date', 'invalid');
711      return;
712    }
713    if (todaysDate < new Date(rnaLaterDate.substring(0,4),new Number(rnaLaterDate.substring(4,6)-1), rnaLaterDate.substring(6)) )
714    {
715      setInputStatus('rnaLaterDate', 'Future date is not valid', 'invalid');
716      return;
717    }
718    rnaLaterTimestamp = Dates.parseString(rnaLaterDate + ' ' + rnaLaterTime, 'yyyyMMdd HHmm');
719    if (rnaLaterTimestamp == null)
720    {
721      if (rnaLaterDate != '') setInputStatus('rnaLaterDate', 'Not a valid time', 'invalid');
722      return;
723    }
724    if (samplingDateIsValid && rnaLaterTimestamp)
725    {
726      var samplingTimestamp = Dates.parseString(frm.samplingDate.value + ' ' + frm.samplingTime.value, 'yyyyMMdd Hmm');     
727      if (samplingTimestamp)
728      {
729        if (rnaLaterTimestamp.getDate() == samplingTimestamp.getDate() && rnaLaterTimestamp.getTime()<samplingTimestamp.getTime())
730        {
731          setInputStatus('rnaLaterDate', 'RNA-later date+time must later then Sampling date+time','invalid');
732          return;
733        }
734        if (rnaLaterTimestamp.getDate() != samplingTimestamp.getDate())
735        {
736          setInputStatus('rnaLaterDate', 'Sampling and RNA later dates are different', 'warning');
737          return;
738        }
739      }
740     
741    }
742    setInputStatus('rnaLaterDate', '', 'valid');
743  }
744   
745  rnaLaterDateIsValid = true;
746}
747
748function arrivalDateOnBlur()
749{
750  var frm = document.forms['reggie'];
751  var arrivalDate = frm.arrivalDate.value;
752  var todaysDate = new Date();
753  arrivalDateIsValid = false;
754
755  setInputStatus('arrivalDate', '', '');
756
757  if (arrivalDate != '')
758  {
759    arrivalDate = autoFillDate(arrivalDate);
760    frm.arrivalDate.value = arrivalDate;
761
762    if (!Dates.isDate(arrivalDate, 'yyyyMMdd'))
763    {
764      setInputStatus('arrivalDate', 'Not a valid date', 'invalid');
765      return;
766    }
767    if (todaysDate < new Date(arrivalDate.substring(0,4), new Number(arrivalDate.substring(4,6))-1, arrivalDate.substring(6)))
768    {
769      setInputStatus('arrivalDate', 'Future dates are not valid','invalid');
770      return; 
771    }
772    setInputStatus('arrivalDate', '', 'valid');
773  }
774  else
775  {
776    setInputStatus('arrivalDate', 'Missing', 'warning');
777  } 
778  arrivalDateIsValid = true;
779}
780
781function nofTubesOnChange()
782{
783  var frm = document.forms['reggie'];
784  var nofTubes = frm.nofTubes.value;
785
786  if (nofTubes == '')
787  {
788    setInputStatus('nofTubes', 'Missing', 'invalid');
789    return;
790  }
791  if (nofTubes < '1')
792  {
793    setInputStatus('nofTubes', 'Must be at least 1', 'invalid');
794    return;   
795  }
796  setInputStatus('nofTubes','', 'valid');
797  nofTubesIsValid = true; 
798}
799
800function padOnChange()
801{
802  var frm = document.forms['reggie'];
803  var PAD = frm.pad.value;
804  if (PAD == '')
805  {
806    setInputStatus('pad', 'Missing', 'warning');
807    return;
808  }
809  frm.pad.value = PAD.replace(/\+/, '-');
810  setInputStatus('pad', '', 'valid');
811}
812
813function lateralityOnChange()
814{ 
815  lateralityIsValid = false;
816 
817  // Check selected laterality against specimen tubes
818  var frm = document.forms['reggie'];
819  var selectedLaterality = Forms.getCheckedRadio(frm.laterality);
820 
821  // No laterality/case selected
822  if (selectedLaterality == null) 
823  {
824    setInputStatus('laterality', 'Not selected', 'invalid');
825    return;
826  }
827  setInputStatus('laterality', '', 'valid');
828  lateralityIsValid = true;
829  var laterality = selectedLaterality.value; 
830  if (laterality == '')
831  {
832    laterality = null;
833  } 
834 
835  for (var i = 0; i < caseInfo.specimen.length; i++)
836  {
837    var specimen = caseInfo.specimen[i];
838    if (specimen.laterality != laterality)
839    {
840      setInputStatus('laterality', 'Specimen tubes are updated to: ' + laterality, 'valid')         
841      return;
842    }
843  } 
844}
845
846function specimenTypeOnClick()
847{
848  var frm = document.forms['reggie'];
849  var selectedSpecimenType = frm.specimenType.value;
850 
851  specimenTypeIsValid = true;
852  var specimenType = null;
853  if (selectedSpecimenType != "")
854  {
855    specimenType = selectedSpecimenType;
856  }
857 
858  for (var i=0; i<caseInfo.specimen.length; i++)
859  {
860    var specimen = caseInfo.specimen[i];
861    if (specimen.specimenType != specimenType)
862    {
863      setInputStatus('specimenType', 'Specimen tubes are updated to: ' + specimenType, 'valid')         
864      return;
865    }
866  }
867  setInputStatus('specimenType', '', 'valid');
868}
869
870function biopsyTypeOnClick()
871{
872  var frm = document.forms['reggie'];
873  var selectedBiopsyType = frm.biopsyType.value;
874  biopsyTypeIsValid = true;
875  var biopsyType = null;
876  if (selectedBiopsyType != "")
877  {
878    biopsyType = selectedBiopsyType;
879  }
880 
881  for (var i=0; i<caseInfo.specimen.length; i++)
882  {
883    var specimen = caseInfo.specimen[i];
884    if (specimen.biopsyType != biopsyType)
885    {
886      setInputStatus('biopsyType', 'Specimen tubes are updated to: ' + biopsyType, 'valid')         
887      return;
888    }
889  }
890  setInputStatus('biopsyType', '', 'valid');
891}
892
893function step3IsValid()
894{ 
895  var step3IsValid = false;
896  var i=0;
897  var bioWellsAreValid = true;
898 
899  while (i<boxesAreValid.length && bioWellsAreValid)
900  {
901    if (!boxesAreValid[i] || !wellsAreValid[i])
902    {
903      bioWellsAreValid = false;
904    }     
905    i++;
906  }
907  step3IsValid = bioWellsAreValid; 
908  return step3IsValid;
909}
910
911function goCreate()
912{
913  if (!step3IsValid()) return;
914
915  Main.hide('gocancel');
916  Main.hide('gocreate');
917  Main.hide('goupdate');
918  var frm = document.forms['reggie'];
919 
920
921  caseInfo.laterality = Forms.getCheckedRadio(frm.laterality).value;
922  caseInfo.pad = frm.pad.value;
923  caseInfo.samplingDate = Main.trimString(frm.samplingDate.value + ' ' + frm.samplingTime.value);
924  caseInfo.rnaLaterDate = Main.trimString(frm.rnaLaterDate.value + ' ' + frm.rnaLaterTime.value);
925  caseInfo.otherPathNote = frm.otherPathNote.value;
926  caseInfo.arrivalDate = Main.trimString(frm.arrivalDate.value);
927 
928  var nofTubes = frm.nofTubes.value;
929  for (var i=0; i<nofTubes; i++)
930  {
931    var specimenTube = new Object();       
932    if (caseInfo.specimen[i]) specimenTube = caseInfo.specimen[i];
933    specimenTube.name = caseInfo.name+'.'+(1+i);
934
935    frm.elements['box'+i].disabled = true;
936    frm.elements['row'+i].disabled = true;
937    frm.elements['column'+i].disabled = true;
938    frm.elements['operatorComment'+i].disabled = true;
939   
940    if (boxInfo[i] != '') specimenTube.boxId = boxInfo[i];
941    if (frm.elements['row'+i].value != '') specimenTube.row = frm.elements['row'+i].value;
942    if (frm.elements['column'+i].value != '') specimenTube.column = frm.elements['column'+i].value;
943    if (frm.elements['operatorComment'+i].value != '') specimenTube.operatorComment = frm.elements['operatorComment'+i].value;
944    if (frm.specimenType.value != '') specimenTube.specimenType = frm.specimenType.value;
945    if (frm.biopsyType.value != '') specimenTube.biopsyType = frm.biopsyType.value;
946   
947    caseInfo.specimen[i] = specimenTube;
948  }
949
950  var submitInfo = new Object();
951  submitInfo.caseInfo = caseInfo;
952
953  if (debug) Main.debug(JSON.stringify(submitInfo));
954 
955  var request = Ajax.getXmlHttpRequest();
956  var url = 'SpecimenTubeRegistration.servlet?ID=<%=ID%>&cmd=';
957  url += updateMode ? 'UpdateSpecimenTubes' : 'CreateSpecimenTubes';
958  request.open("POST", url, false);
959  request.setRequestHeader("Content-Type", "application/json");
960  request.send(JSON.stringify(submitInfo));
961
962  if (debug) Main.debug(request.responseText);
963
964  var response = JSON.parse(request.responseText);
965  if (response.status != 'ok')
966  {
967    setFatalError(response.message);
968    return false;
969  }
970
971  var msg = '<ul>';
972  for (var i = 0; i < response.messages.length; i++)
973  {
974    msg += '<li>' + response.messages[i];
975  }
976  msg += '</ul>';
977  setInnerHTML('done', msg);
978  Main.show('done');
979  Main.show('gorestart');
980}
981
982function getCaseInfo()
983{
984  var frm = document.forms['reggie'];
985  var caseName = frm.caseName.value;
986  var request = Ajax.getXmlHttpRequest();
987  var url = 'SpecimenTubeRegistration.servlet?ID=<%=ID%>&cmd=GetCaseInfo';
988  url += '&caseName=' + caseName;
989  request.open("GET", url, false);
990  request.send(null);
991
992  if (debug) Main.debug(request.responseText);
993
994  var response = JSON.parse(request.responseText);
995  if (response.status != 'ok')
996  {
997    setFatalError(response.message);
998    return false;
999  }
1000  caseInfo = response.caseInfo;
1001}
1002</script>
1003
1004</base:head>
1005<base:body onload="init()">
1006<p:path style="margin-top: 20px; margin-bottom: 10px;">
1007    <p:pathelement title="Reggie" href="<%="index.jsp?ID="+ID%>" />
1008    <p:pathelement title="Specimen tube registration" />
1009  </p:path>
1010
1011  <%
1012  if (sc.getActiveProjectId() == 0)
1013  {
1014    %>
1015    <base:note type="warning" style="width: 800px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
1016      No project has been selected. You may proceed with the registration but
1017      created items will not be shared.
1018    </base:note>
1019    <%
1020  }
1021  %>
1022
1023  <form name="reggie" onsubmit="return false;">
1024 
1025  <!-- 1. Case name-->
1026  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1027  <tr>
1028    <td rowspan="3" class="stepno">1</td>
1029    <td class="steptitle">Enter Case Name</td>
1030  </tr>
1031  <tr>
1032    <td class="stepfields">
1033      <table border="0" cellspacing="0" cellpadding="0" width="100%">
1034      <tr valign="top">
1035        <td class="prompt">Case name</td>
1036        <td class="input"><input type="text" name="caseName" 
1037          size="18" maxlength="12" onkeypress="doOnTabOrEnter(event, goNext)"></td>
1038        <td class="status" id="case.status"></td>
1039        <td class="help"><span id="case.message" class="message" style="display: none;"></span>The case (barcode) associated with this specimen tube.</td>
1040      </tr>
1041      </table>
1042    </td>
1043  </tr>
1044  </table>
1045 
1046  <div id="caseSection" style="display: none;">
1047  <p></p>
1048  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1049  <tr>
1050    <td rowspan="2" class="stepno">2</td>
1051    <td id="step2.title" class="steptitle">Enter Case information</td>
1052  </tr>
1053  <tr>
1054    <td class="stepfields">
1055    <table border="0" cellspacing="0" cellpadding="0" width="100%">
1056    <tr>
1057      <td class="prompt">Number of tubes</td>
1058      <td class="input"><input type="text" name="nofTubes"
1059        value="" size="12" maxlength="10" onblur='nofTubesOnChange()'></td>
1060      <td class="status" id="nofTubes.status"></td>
1061      <td class="help"><span id="nofTubes.message" class="message" style="display:none"></span>Number of tubes in this case.</td>
1062    </tr>
1063    <tr valign="top">
1064      <td class="prompt">Arrival date</td>
1065      <td class="input"><input type="text" name="arrivalDate"
1066        value="" size="12" maxlength="10" onblur="arrivalDateOnBlur()"></td>
1067      <td class="status" id="arrivalDate.status"></td>
1068      <td class="help"><span id="arrivalDate.message" class="message" style="display:none"></span>Date when the specimen tubes arrived(YYYYMMDD or MMDD).</td>
1069    </tr>
1070    <tr>
1071      <td class="prompt">PAD</td>
1072      <td class="input"><input type="text" name="pad" 
1073        value="" size="12" maxlength="10"
1074        onblur="padOnChange()"></td>
1075      <td class="status" id="pad.status"></td>
1076      <td class="help"><span id="pad.message" class="message" style="display: none;"></span></td>
1077    </tr>
1078    <tr id="samplingDateSection" valign="top">
1079      <td class="prompt">Sampling date</td>
1080      <td class="input"><input type="text" name="samplingDate" value="" size="12" maxlength="10" 
1081          onkeypress="focusOnEnter(event, 'samplingTime')" onblur="samplingDateTimeOnChange()">
1082        Time <input type="text" name="samplingTime" value="" size="6" maxlength="4" 
1083          onkeypress="focusOnEnter(event, 'rnaLaterDate')" onblur="samplingDateTimeOnChange()"></td>
1084      <td class="status" id="samplingDate.status"></td>
1085      <td class="help"><span id="samplingDate.message" class="message" style="display: none;"></span>Date+time of surgical removal (YYYYMMDD, HHMM or MMDD, HMM)</td>
1086    </tr>
1087    <tr id="rnaLaterDateSection" valign="top">
1088      <td class="prompt">RNA Later date</td>
1089      <td class="input"><input type="text" name="rnaLaterDate" value="" size="12" maxlength="10"
1090          onkeypress="focusOnEnter(event, 'rnaLaterTime')" onblur="rnaLaterDateTimeOnChange()">
1091        Time <input type="text" name="rnaLaterTime" value="" size="6" maxlength="4"
1092          onblur="rnaLaterDateTimeOnChange()"></td>
1093      <td class="status" id="rnaLaterDate.status"></td>
1094      <td class="help"><span id="rnaLaterDate.message" class="message" style="display: none;"></span>Date+time of pathology handling (YYYYMMDD, HHMM or MMDD, HMM)</td>
1095    </tr>
1096    <tr>
1097      <td class="prompt" id="laterality.prompt">Laterality</td>
1098      <td class="input" id="laterality.input">
1099        <input type="radio" name="laterality" value="LEFT" onclick="lateralityOnChange()">LEFT<br>
1100        <input type="radio" name="laterality" value="RIGHT" onclick="lateralityOnChange()">RIGHT<br>
1101        <input type="radio" name="laterality" value="" checked onclick="lateralityOnChange()"><i>unknown</i>
1102      </td>
1103      <td class="status" id="laterality.status"></td>
1104      <td class="help"><span id="laterality.message" class="message" style="display: none;"></span></td>
1105    </tr>
1106    <tr>
1107      <td class="prompt" id="specimenType.prompt">Speciment type</td>
1108      <td class="input" id="specimenType.input">
1109        <select name="specimenType" onChange="specimenTypeOnClick()">
1110          <option selected value="Primary">Primary
1111          <option value="LymfnodeRegional">LymfnodeRegional         
1112          <option value="MetastasisDistant">MetastasisDistant
1113          <option value="RecurrenceLocal">RecurrenceLocal
1114          <option value="RecurrenceRegional">RecurrenceRegional
1115          <option value="" >unknown
1116        </select>
1117      </td>
1118      <td class="status" id="specimenType.status"></td>
1119      <td class="help"><span id="specimenType.message" class="message" style="display: none;"></span></td>
1120    </tr>
1121    <tr>
1122      <td class="prompt" id="biopsyType.prompt">Biopsy type</td>
1123      <td class="input" id="biopsyType.input">
1124        <select name="biopsyType" onChange="biopsyTypeOnClick()">
1125          <option value="SpecimenSurgery">SpecimenSurgery
1126          <option value="SpecimenCoreBiopsy">SpecimenCoreBiopsy
1127          <option value="SpecimenFineNeedleAspiration" >SpecimenFineNeedleAspiration       
1128          <option value="" >unknown
1129        </select>
1130      </td>
1131      <td class="status" id="biopsyType.status"></td>
1132      <td class="help"><span id="biopsyType.message" class="message" style="display: none;"></span></td>
1133    </tr>
1134   
1135    <tr>
1136      <td class="prompt" id="otherPathNote.prompt">Other path note</td>
1137      <td class="input" id="otherPathNote.input"><textarea rows="3" cols="30" 
1138        name="otherPathNote" value="" onkeypress="doOnTab(event, goNext)"></textarea></td>
1139      <td class="status" id="otherPathNote.status"></td>
1140      <td class="help"><span id="otherPathNote.message" class="message" style="display: none;"></span></td>
1141    </tr>
1142    </table>
1143    </td>
1144     
1145  </tr>
1146  </table>
1147  </div>
1148 
1149  <div id="tubeSection" style="display:none;">
1150  <p></p>
1151  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1152  <tr>
1153    <td rowspan="2" class="stepno">3</td>
1154    <td class="steptitle">Enter tube information</td>   
1155  </tr>
1156  <tr>
1157    <td class="stepfields">
1158      <table id="tubeInputs" border="0" cellspacing="0" cellpadding="0" width="100%">
1159      </table>
1160    </td>
1161  </tr>
1162  </table>
1163  </div>
1164   
1165  <div class="error" id="errorMessage" style="display: none; width: 800px; margin-left: 20px; margin-bottom: 0px;"></div>
1166 
1167  <div id="done" class="success" style="display: none; width: 800px; margin-left: 20px; margin-top: 20px;"></div>
1168 
1169  <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
1170    <tr>
1171      <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
1172      <td><base:button id="gonext" title="Next" image="gonext.gif" onclick="goNext(true)"/></td>
1173      <td><base:button id="gocreate" title="Create" image="gonext.gif" onclick="goCreate()" style="display: none;"/></td>
1174      <td><base:button id="goupdate" title="Update" image="gonext.gif" onclick="goCreate()" style="display: none;"/></td>
1175      <td><base:button id="gorestart" title="Restart" image="goback.gif" onclick="goRestart(true)" style="display: none;"/></td>
1176      <td id="gonext.message" class="message"></td>
1177    </tr>
1178  </table>
1179  </form>
1180 
1181</base:body>
1182</base:page>
1183<%
1184}
1185finally
1186{
1187  if (dc != null) dc.close();
1188}
1189%>
Note: See TracBrowser for help on using the repository browser.