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

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

Some minor changes to the partition wizard and correction of a misspelled word in specimen wizard

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