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

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

Merged 2.0-stable branch into trunk

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