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

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

References #337 The specimen tube wizard restarts automatically with a delay of 2s. The restart-process can be stopped by pressing the 'Stop'-button.

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