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

Last change on this file since 1390 was 1390, checked in by Martin Svensson, 10 years ago

References #317. Added warning if different boxes are used.

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