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

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

References #330 The partition registration wizard is almost finished. Known issues are: not enough validation of data, no 'move forward on enter' in the fields and perhaps more

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 35.8 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    var row = 'row'+i;
358    var column = 'column'+i;
359    var operatorComment = 'operatorComment'+i;
360    inputTubeHtml += '<tr>';
361    inputTubeHtml += '<td class="subprompt">Box</td>';
362    inputTubeHtml += '<td class="input">';
363    inputTubeHtml += '<input type="text" onkeypress="focusOnEnter(event, \''+row+'\')" name='+box+' value="' + boxValue + '" '+ boxDisabled +' size="12" maxlength="12" onKeyUp="boxOnKeyUp('+i+')" onBlur="boxOnChange('+i+')"></td>';
364    inputTubeHtml += '<td class="status" id="'+box+'.status"></td>';
365    inputTubeHtml += '<td class="help"><span id="'+box+'.message" class="message" style="display: none;"></span>Box-number where the specimen tube is located in.</td>';   
366    inputTubeHtml += '</tr>';       
367   
368    var wellDisabled = rowValue != '' || boxValue == '' ? 'disabled' : '';
369    inputTubeHtml += '<tr>';
370    inputTubeHtml += '<td class="subprompt">Row</td>';
371    inputTubeHtml += '<td class="input"><input style="text-transform:uppercase;" type="text"  onkeypress="focusOnEnter(event, \''+column+'\')" name='+row+' value="' + rowValue + '" size="3" maxlength="2" ' + wellDisabled;
372    inputTubeHtml += ' onBlur="wellOnChange('+i+')">';
373    inputTubeHtml += '&nbsp;Column<input type="text" onkeypress="focusOnEnter(event, \''+operatorComment+'\')" name='+column+' value="'+ columnValue + '" size="3" maxlength="3" ' + wellDisabled;
374    inputTubeHtml += ' onBlur="wellOnChange('+i+')">';
375    inputTubeHtml += '&nbsp;<a href="javascript:suggestWellOnClick('+i+')" disabled>Suggest</a>'
376    inputTubeHtml += '</td>';
377    inputTubeHtml += '<td class="status" id="rowColumn'+i+'.status"></td>';
378    inputTubeHtml += '<td class="help"><span id="rowColumn'+i+'.message" class="message" style="display: none;"></span></td>';   
379    inputTubeHtml += '</tr>';
380
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        onkeypress="focusOnEnter(event, 'arrivalDate')" value="1" 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        onkeypress="focusOnEnter(event, 'pad')" 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        onkeypress="focusOnEnter(event, 'samplingDate')" 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          onkeypress="focusOnEnter(event, 'specimenType')" 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 onkeypress="focusOnEnter(event, 'biopsyType')" 
1110          name="specimenType" onChange="specimenTypeOnClick()"
1111        >
1112          <option selected value="" >unknown
1113          <option value="Primary">Primary
1114          <option value="LymfnodeRegional">LymfnodeRegional         
1115          <option value="MetastasisDistant">MetastasisDistant
1116          <option value="RecurrenceLocal">RecurrenceLocal
1117          <option value="RecurrenceRegional">RecurrenceRegional         
1118        </select>
1119      </td>
1120      <td class="status" id="specimenType.status"></td>
1121      <td class="help"><span id="specimenType.message" class="message" style="display: none;"></span></td>
1122    </tr>
1123    <tr>
1124      <td class="prompt" id="biopsyType.prompt">Biopsy type</td>
1125      <td class="input" id="biopsyType.input">
1126        <select onkeypress="focusOnEnter(event, 'otherPathNote')" 
1127          name="biopsyType" onChange="biopsyTypeOnClick()"
1128        >
1129          <option selected value="" >unknown
1130          <option value="SpecimenSurgery">SpecimenSurgery
1131          <option value="SpecimenCoreBiopsy">SpecimenCoreBiopsy
1132          <option value="SpecimenFineNeedleAspiration" >SpecimenFineNeedleAspiration
1133        </select>
1134      </td>
1135      <td class="status" id="biopsyType.status"></td>
1136      <td class="help"><span id="biopsyType.message" class="message" style="display: none;"></span></td>
1137    </tr>
1138   
1139    <tr>
1140      <td class="prompt" id="otherPathNote.prompt">Other path note</td>
1141      <td class="input" id="otherPathNote.input"><textarea rows="3" cols="30" 
1142        name="otherPathNote" value="" onkeypress="doOnTab(event, goNext)"></textarea></td>
1143      <td class="status" id="otherPathNote.status"></td>
1144      <td class="help"><span id="otherPathNote.message" class="message" style="display: none;"></span></td>
1145    </tr>
1146    </table>
1147    </td>
1148     
1149  </tr>
1150  </table>
1151  </div>
1152 
1153  <div id="tubeSection" style="display:none;">
1154  <p></p>
1155  <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1156  <tr>
1157    <td rowspan="2" class="stepno">3</td>
1158    <td class="steptitle">Enter tube information</td>   
1159  </tr>
1160  <tr>
1161    <td class="stepfields">
1162      <table id="tubeInputs" border="0" cellspacing="0" cellpadding="0" width="100%">
1163      </table>
1164    </td>
1165  </tr>
1166  </table>
1167  </div>
1168   
1169  <div class="error" id="errorMessage" style="display: none; width: 800px; margin-left: 20px; margin-bottom: 0px;"></div>
1170 
1171  <div id="done" class="success" style="display: none; width: 800px; margin-left: 20px; margin-top: 20px;"></div>
1172 
1173  <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
1174    <tr>
1175      <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
1176      <td><base:button id="gonext" title="Next" image="gonext.gif" onclick="goNext(true)"/></td>
1177      <td><base:button id="gocreate" title="Create" image="gonext.gif" onclick="goCreate()" style="display: none;"/></td>
1178      <td><base:button id="goupdate" title="Update" image="gonext.gif" onclick="goCreate()" style="display: none;"/></td>
1179      <td><base:button id="gorestart" title="Restart" image="goback.gif" onclick="goRestart(true)" style="display: none;"/></td>
1180      <td id="gonext.message" class="message"></td>
1181    </tr>
1182  </table>
1183  </form>
1184 
1185</base:body>
1186</base:page>
1187<%
1188}
1189finally
1190{
1191  if (dc != null) dc.close();
1192}
1193%>
Note: See TracBrowser for help on using the repository browser.