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

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

References #317. Fixing a glitch that prevented the wizard to proceed to step 3 when no laterality was selected.

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