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

Last change on this file since 1726 was 1726, checked in by Nicklas Nordborg, 10 years ago

Fixes #418: Dates are not parsed correctly by the sample report generator

Hope this doesn't break some other wizard...

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