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

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

Fixes #341. Specimen tube registration wizard should check name format.

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