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

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

References #317. Added two more annotations to specimen tubes and also some helpful features when selecting row/column in a box. Annotation:partition date was removed, cause it should be in the partition wizard instead.

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