source: extensions/net.sf.basedb.reggie/trunk/resources/reports/case_summary.jsp @ 2098

Last change on this file since 2098 was 2098, checked in by Nicklas Nordborg, 9 years ago

Fixes #521: Add DNA and FlowThrough? information to Case summary page

File size: 40.8 KB
Line 
1<%@ page
2  pageEncoding="UTF-8"
3  session="false"
4  import="net.sf.basedb.core.Application"
5  import="net.sf.basedb.core.User"
6  import="net.sf.basedb.core.Role"
7  import="net.sf.basedb.core.Group"
8  import="net.sf.basedb.core.DbControl"
9  import="net.sf.basedb.core.SessionControl"
10  import="net.sf.basedb.core.SystemItems"
11  import="net.sf.basedb.core.ItemQuery"
12  import="net.sf.basedb.core.query.Expressions"
13  import="net.sf.basedb.core.query.Hql"
14  import="net.sf.basedb.core.query.Restrictions"
15  import="net.sf.basedb.clients.web.Base"
16  import="net.sf.basedb.clients.web.util.HTML"
17  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
18  import="net.sf.basedb.util.Values"
19  import="java.util.List"
20%>
21<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
22<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
23<%
24final SessionControl sc = Base.getExistingSessionControl(request, true);
25final String ID = sc.getId();
26final float scale = Base.getScale(sc);
27final String home = ExtensionsControl.getHomeUrl("net.sf.basedb.reggie");
28DbControl dc = null;
29try
30{
31  dc = sc.newDbControl();
32  final User user = User.getById(dc, sc.getLoggedInUserId());
33 
34  boolean isAdmin = user.getId() == SystemItems.getId(User.ROOT);
35  boolean isPatientCurator = false;
36  if (!isAdmin)
37  {
38    try
39    {
40      Role admin = Role.getById(dc, SystemItems.getId(Role.ADMINISTRATOR));
41      isAdmin = sc.isMemberOf(admin);
42    }
43    catch (RuntimeException ex)
44    {}
45  }
46  try
47  {
48    ItemQuery<Group> query = Group.getQuery();
49    query.restrict(Restrictions.eq(Hql.property("name"), Expressions.string("PatientCurator")));
50    List<Group> result = query.list(dc);
51    if (result.size() == 1)
52    {
53      isPatientCurator = sc.isMemberOf(result.get(0));
54    }
55  }
56  catch (RuntimeException ex)
57  {}
58 
59  final String caseName = request.getParameter("caseName");
60  final String pageType = Values.getString(request.getParameter("pageType"), "default");
61 
62  boolean iframe = "iframe".equals(pageType);
63  boolean popup = "popup".equals(pageType);
64  boolean fullPage = !iframe && !popup;
65%>
66<base:page type="<%=pageType %>" >
67<base:head scripts="ajax.js" styles="path.css">
68  <link rel="stylesheet" type="text/css" href="../css/reggie.css">
69  <link rel="stylesheet" type="text/css" href="../css/case_summary.css">
70  <script language="JavaScript" src="../reggie.js" type="text/javascript" charset="UTF-8"></script>
71
72<script language="JavaScript">
73
74var debug = false;
75var ID = '<%=ID%>';
76
77var TRUNCATE_SIZE = [-1, 30, 20, 15];
78
79// Style the message as a warning message
80function asWarning(message)
81{
82  message = '<span class="warning">' + message + '</span>';
83  return message;
84}
85
86// Style the message as a 'no information' message
87function asNoInfo(message)
88{
89  message = '<span class="no-info">' + message + '</span>';
90  return message;
91}
92
93// Generte a 'Missing' warning if the value is missing
94function warnIfMissing(value)
95{
96  var message = value ? value : asWarning('Missing');
97  return message;
98}
99
100// Style the message as a 'flag information' message
101function asFlagInfo(message, icon)
102{
103  message = '<span class="flag-info">' + message + '&nbsp;' + '<img src="../images/'+icon+'"></span>';
104  return message;
105}
106
107// Style the message as a 'fail information' message
108function asFailInfo(message, icon)
109{
110  message = '<span class="fail-info">' + message + '&nbsp;' + '<img src="../images/'+icon+'"></span>';
111  return message;
112}
113
114function asConsent(consent, consentDate)
115{
116  var warn = !consent || !consentDate;
117  var message;
118  if (!consent)
119  {
120    message = 'Missing' + (consentDate ? ', ' + consentDate : '');
121  }
122  else
123  {
124    message = consent + ', ' + (consentDate ? consentDate : 'Missing date');
125   
126  }
127  return warn ? asWarning(message) : message
128}
129
130function asBioPlateLocation(well)
131{
132  if (!well) return '';
133  var plate = well.bioPlate;
134  var text = makeLink('BIOPLATE', plate)  + ' ' + well.location;
135  if (plate.storage)
136  {
137    var storage = plate.storage;
138    var tmp = [];
139    if (storage.name) tmp[tmp.length] = storage.name;
140    if (storage.section) tmp[tmp.length] = 'section: ' +storage.section;
141    if (storage.tray) tmp[tmp.length] = 'tray: ' +storage.tray;
142    if (storage.position) tmp[tmp.length] = 'position: ' +storage.position;
143
144    text = '<span class="more-info" title="' + tmp.join('; ')+'">' + text + ' </span>';
145  }
146  return text;
147}
148
149// Set the content of the element 'id' to the value
150function setValue(id, value)
151{
152  setInnerHTML(id, value);
153}
154
155function truncate(value, maxLength)
156{
157  if (!value) return value;
158  if (maxLength > 2 && value.length > maxLength)
159  {
160    var tmp = '<span class="truncated" title="'+value+'">'+value.substring(0, maxLength-2) + '...</span>';
161    value = tmp;
162  }
163  return value;
164}
165
166function addColumn(id, value)
167{
168  var tr = document.getElementById(id);
169  var td = document.createElement('td');
170  if (tr.hasAddedColumns)
171  {
172    td.className = 'extra-column';
173    tr.childNodes[tr.childNodes.length-1].className += ' fixed-column';
174  }
175  tr.hasAddedColumns = true;
176  if (value != null)
177  {
178    td.innerHTML = value == '' ? '&nbsp;' : value;
179    if (tr.className.indexOf('dynamic-column') >= 0)
180    {
181      tr.style.display = 'table-row';
182    }
183  }
184  else
185  {
186    td.innerHTML = '&nbsp;';
187  }
188  tr.appendChild(td);
189}
190
191function makeLink(itemType, item, maxLength)
192{
193  var link = '';
194  if (item)
195  {
196    var name = truncate(item.name, maxLength);
197    if (item.id)
198    {
199      link = '<span class="link" onclick="Main.itemOnClick(event, ID, \''+itemType+'\', '+item.id+', '+item.editable+')">';
200      link += name + '</span>';
201    }
202    else
203    {
204      link = name;
205    }
206  }
207  return link;
208}
209
210function asFileLink(file, icon)
211{
212  var link = '';
213  if (file)
214  {
215    link = '<span class="link filelink" onclick="Main.viewFile(ID,'+file.id+')"><img src="../images/'+icon+'"></span>';
216  }
217  return link;
218}
219
220function asCaseList(allCases, mainCase)
221{
222  var html = '';
223  for (var i = 0; i < allCases.length; i++)
224  {
225    var cse = allCases[i];
226    if (html != '') html += ', ';
227    if (cse != mainCase)
228    {
229      html += '<span class="link" onclick="caseSummary(\''+cse + '\')" title="Show summary of case #'+cse+'">'+cse+'</span>';
230    }
231    else
232    {
233      html += '<b>' + cse + '</b>';
234    }
235  }
236  return allCases.length > 1 ? html : null;
237}
238
239function formatDate(value)
240{
241  if (!value) return '';
242  if (value.length == 8)
243  {
244    value = value.substr(0, 4) + '-' + value.substr(4, 2) + '-' + value.substr(6, 2);
245  }
246  return value;
247}
248
249
250function formatDateTime(value, compareToDate)
251{
252  if (!value) return '';
253  if (value.length == 8)
254  {
255    value = formatDate(value);
256  }
257  else if (value.length == 13)
258  {
259    // If the compareToDate is the same day as the 'value' date, skip the date and replace with white-space
260    if (compareToDate && value.substr(0, 8) == compareToDate.substr(0, 8))
261    {
262      value = '<span class="invisible">'+formatDate(value.substr(0, 8)) + '</span> ' + value.substr(9, 2) + ':'+value.substr(11, 2)
263    }
264    else
265    {
266      value = formatDate(value.substr(0, 8)) + ' ' + value.substr(9, 2) + ':'+value.substr(11, 2);
267    }
268  }
269  return value;
270}
271
272function formatQuantity(value, scale, unit)
273{
274  var result = '';
275  if (value != null)
276  {
277    if (scale) value = value / scale;
278    result = formatNumber(value, unit, 2);
279  }
280  return result;
281}
282
283function init()
284{
285  var frm = document.forms['reggie'];
286  if (frm.caseName) frm.caseName.focus();
287 
288  var caseName = '<%=HTML.javaScriptEncode(caseName)%>';
289  var isAdmin = <%=isAdmin ? "true" : "false"%>;
290  var isPatientCurator = <%=isPatientCurator ? "true" : "false"%>;
291 
292  var url = '../CaseSummary.servlet?ID=<%=ID%>&cmd=GetCaseInfo';
293  url += '&caseName=<%=HTML.urlEncode(caseName)%>';
294  var request = Ajax.getXmlHttpRequest();
295  request.open("GET", url, false);
296  request.send(null);
297 
298  if (debug) Main.debug(request.responseText);
299
300  var response = JSON.parse(request.responseText);
301  if (response.status != 'ok')
302  {
303    setFatalError(response.message);
304    return false;
305  }
306 
307  Main.show('all-info');
308 
309  var caseInfo = response.caseInfo;
310  var site = response.site;
311  var consentOk = true;
312 
313  if (caseInfo)
314  {
315    consentOk = !caseInfo.consent || caseInfo.consent == 'Yes';
316    addColumn('case.name', makeLink('SAMPLE', caseInfo));
317    addColumn('case.registrationDate', formatDate(caseInfo.registrationDate));
318    addColumn('case.site', site ? site.name : null);
319    addColumn('case.consent', asConsent(caseInfo.consent, formatDate(caseInfo.consentDate)));
320    addColumn('case.laterality', consentOk ? warnIfMissing(caseInfo.laterality) : null);
321    addColumn('case.comment', caseInfo.comment);
322  }
323  else
324  {
325    addColumn('case.name', asNoInfo('No case information has been registered'));
326    Main.hide('case-details');
327  }
328 
329  var patient = response.patient;
330  if (patient)
331  {
332    if (consentOk)
333    {
334      addColumn('patient.name', makeLink('BIOSOURCE', patient));
335      addColumn('patient.registrationDate', formatDate(patient.registrationDate));
336      addColumn('patient.personalNumber', warnIfMissing(patient.personalNumber));
337      addColumn('patient.allFirstNames', warnIfMissing(patient.allFirstNames));
338      addColumn('patient.familyName', warnIfMissing(patient.familyName));
339      addColumn('patient.gender', patient.gender);
340      addColumn('patient.allCases', asCaseList(patient.allCases, caseName));
341    }
342    else
343    {
344      Main.hide('patient-info');
345    }
346  }
347  else
348  {
349    addColumn('patient.name', asNoInfo('No patient information has been registered'));
350    Main.hide('patient-details');
351  }
352 
353  var blood = consentOk ? response.blood : null;
354  if (blood && blood.length > 0)
355  {
356    for (var i = 0; i < blood.length; i++)
357    {
358      var b = blood[i];
359      addColumn('blood.name', makeLink('SAMPLE', b));
360      addColumn('blood.registrationDate', formatDate(b.registrationDate));
361      addColumn('blood.consent', asConsent(b.consent, formatDate(b.consentDate)));
362      addColumn('blood.bloodSample', b.bloodSample);
363      addColumn('blood.samplingDate', warnIfMissing(formatDateTime(b.samplingDate)));
364      addColumn('blood.freezerDate', warnIfMissing(formatDateTime(b.freezerDate, b.samplingDate)));
365      addColumn('blood.serum', b.serum);
366      addColumn('blood.comment', b.comment);
367    }
368  }
369  else
370  {
371    if (consentOk)
372    {
373      addColumn('blood.name', asNoInfo('No blood information has been registered'));
374      Main.hide('blood-details');
375    }
376    else
377    {
378      Main.hide('blood-info');
379    }
380  }
381 
382  var specimen = consentOk ? response.specimen : null;
383  var noSpecimen = consentOk ? response.noSpecimen : null;
384  var numSpecimenOrNoSpecimen = 0;
385  if (specimen && specimen.length > 0)
386  {
387    var truncateAt = TRUNCATE_SIZE[Math.min(specimen.length-1, TRUNCATE_SIZE.length)];
388    for (var i = 0; i < specimen.length; i++)
389    {
390      var s = specimen[i];
391      addColumn('specimen.name', makeLink('SAMPLE', s));
392      addColumn('specimen.registrationDate', formatDate(s.registrationDate));
393      addColumn('specimen.storageBox', asBioPlateLocation(s.bioWell));
394      addColumn('specimen.laterality', warnIfMissing(s.laterality));
395      addColumn('specimen.samplingDate', warnIfMissing(formatDateTime(s.samplingDate)));
396      addColumn('specimen.rnaLaterDate', warnIfMissing(formatDateTime(s.rnaLaterDate, s.samplingDate)));
397      addColumn('specimen.pad', warnIfMissing(s.pad));
398      addColumn('specimen.biopsyType', s.biopsyType);
399      addColumn('specimen.remainingQuantity', formatQuantity(s.remainingQuantity, 1000, ' mg'));
400      addColumn('specimen.originalQuantity', formatQuantity(s.originalQuantity, 1000, ' mg'));
401      addColumn('specimen.nofPieces', s.nofPieces);
402      addColumn('specimen.partitionComment', truncate(s.partitionComment, truncateAt));
403      addColumn('specimen.comment', truncate(s.comment, truncateAt));
404      numSpecimenOrNoSpecimen++;
405    }
406    if (!noSpecimen || noSpecimen.length == 0)
407    {
408      Main.hide('nospecimen-info');
409    }
410  }
411  if (noSpecimen && noSpecimen.length > 0)
412  {
413    for (var i = 0; i < noSpecimen.length; i++)
414    {
415      var s = noSpecimen[i];
416      addColumn('nospecimen.name', makeLink('SAMPLE', s));
417      addColumn('nospecimen.registrationDate', formatDate(s.registrationDate));
418      addColumn('nospecimen.laterality', warnIfMissing(s.laterality));
419      addColumn('nospecimen.samplingDate', warnIfMissing(formatDate(s.samplingDate)));
420      addColumn('nospecimen.pad', warnIfMissing(s.pad));
421      addColumn('nospecimen.reasonIfNoSpecimen', s.reasonIfNoSpecimen);
422      addColumn('nospecimen.comment', truncate(s.comment, truncateAt));
423      numSpecimenOrNoSpecimen++;
424    }
425    if (!specimen || specimen.length == 0)
426    {
427      addColumn('specimen.name', asNoInfo('No specimen received; see below for details'));
428      Main.hide('specimen-details');
429    }
430  }
431  if (numSpecimenOrNoSpecimen == 0)
432  {
433    if (consentOk)
434    {
435      addColumn('specimen.name', asNoInfo('No specimen information has been registered'));
436      Main.hide('specimen-details');
437    }
438    else
439    {
440      Main.hide('specimen-info'); 
441    }
442    Main.hide('nospecimen-info');
443  }
444 
445  var histology = consentOk ? response.histology : null;
446  if (histology && histology.length > 0)
447  {
448    var truncateAt = TRUNCATE_SIZE[Math.min(histology.length-1, TRUNCATE_SIZE.length)];
449    for (var i = 0; i < histology.length; i++)
450    {
451      var h = histology[i];
452      addColumn('histology.name', makeLink('SAMPLE', h));
453      addColumn('histology.registrationDate', formatDate(h.registrationDate));
454      addColumn('histology.partitionDate', formatDate(h.partitionDate));
455      addColumn('histology.usedQuantity', formatQuantity(h.originalQuantity, 1000, ' mg'));
456
457      var embedded = h.embedDate ? true : false;
458      addColumn('histology.embedded', embedded ? formatDate(h.embedDate) : 'No');
459      addColumn('histology.embedProtocol', embedded ? makeLink('PROTOCOL', h.embedProtocol, truncateAt) : null);
460      addColumn('histology.paraffinBlock', embedded ? asBioPlateLocation(h.bioWell) : null);
461      addColumn('histology.storageBox', embedded ? null : asBioPlateLocation(h.bioWell));
462
463      var stained = h.stainDate ? true : false;
464      addColumn('histology.stained', stained ? formatDate(h.stainDate) : 'No');
465      addColumn('histology.nofSlides', stained ? h.numStains : null);
466      addColumn('histology.heGlass', stained ? asBioPlateLocation(h.bestStain) : null);
467      addColumn('histology.stainProtocol', stained ? makeLink('PROTOCOL', h.stainProtocol, truncateAt) : null);
468    }
469  }
470  else
471  {
472    if (consentOk)
473    {
474      addColumn('histology.name', asNoInfo('No histology information has been registered'));
475      Main.hide('histology-details');
476    }
477    else
478    {
479      Main.hide('histology-info');
480    }
481  }
482 
483 
484  var lysate = consentOk ? response.lysate : null;
485  if (lysate && lysate.length > 0)
486  {
487    var truncateAt = TRUNCATE_SIZE[Math.min(lysate.length-1, TRUNCATE_SIZE.length)];
488    for (var i = 0; i < lysate.length; i++)
489    {
490      var lys = lysate[i];
491      addColumn('lysate.name', makeLink('EXTRACT', lys));
492      addColumn('lysate.registrationDate', formatDate(lys.registrationDate));
493      addColumn('lysate.partitionDate', formatDate(lys.partitionDate));
494      addColumn('lysate.usedQuantity', formatQuantity(lys.usedQuantity, 1000, ' mg'));
495      addColumn('lysate.multiplePieces', lys.multiplePieces ? 'Yes' : 'No');
496      addColumn('lysate.comment', truncate(lys.comment, truncateAt));
497     
498      var lysis = lys.lysisDate ? true : false;
499      addColumn('lysate.lysisDate', lysis ? formatDate(lys.lysisDate) : 'No');
500      addColumn('lysate.storageBox', lysis ? asBioPlateLocation(lys.bioWell) : null);
501      addColumn('lysate.lysisProtocol', lysis ? makeLink('PROTOCOL', lys.lysisProtocol, truncateAt) : null);
502      addColumn('lysate.remainingQuantity', lysis ? formatQuantity(lys.remainingQuantity, null, ' µg') : null);
503      addColumn('lysate.originalQuantity', lysis ? formatQuantity(lys.originalQuantity, null, ' µg') : null);
504    }
505  }
506  else
507  {
508    if (consentOk)
509    {
510      addColumn('lysate.name', asNoInfo('No lysate information has been registered'));
511      Main.hide('lysate-details');
512    }
513    else
514    {
515      Main.hide('lysate-info');
516    }
517  }
518
519 
520  var rna = consentOk ? response.rna : null;
521  if (rna && rna.length > 0)
522  {
523    var truncateAt = TRUNCATE_SIZE[Math.min(rna.length-1, TRUNCATE_SIZE.length)];
524    for (var i = 0; i < rna.length; i++)
525    {
526      var r = rna[i];
527      addColumn('rna.name', makeLink('EXTRACT', r));
528      addColumn('rna.flag', r.flag ? asFlagInfo(r.flag, 'flag.png') : null);
529      addColumn('rna.registrationDate', formatDate(r.registrationDate));
530      addColumn('rna.storageBox', asBioPlateLocation(r.bioWell));
531      addColumn('rna.usedQuantity', formatQuantity(r.usedQuantity, null, ' µg'));
532      addColumn('rna.extractionDate', formatDate(r.extractionDate));
533      addColumn('rna.extractionProtocol', makeLink('PROTOCOL', r.extractionProtocol, truncateAt));
534      addColumn('rna.remainingQuantity', formatQuantity(r.remainingQuantity, null, ' µg'));
535      addColumn('rna.originalQuantity', formatQuantity(r.originalQuantity, null, ' µg'));
536      addColumn('rna.ndConc', formatQuantity(r.ndConc, null, ' ng/µl'));
537      addColumn('rna.comment', truncate(r.comment, truncateAt));
538     
539      var hasQc = r.nofQc ? true : false;
540      addColumn('rna.qc', hasQc ? (r.qcDate ? formatDate(r.qcDate) : asNoInfo('Waiting for Caliper...')) : 'No');
541      addColumn('rna.nofQc', hasQc ? r.nofQc : null);
542      addColumn('rna.qcProtocol', hasQc ? makeLink('PROTOCOL', r.qcProtocol, truncateAt) : null);
543      addColumn('rna.qcPlate', hasQc ? asBioPlateLocation(r.qcPlate)+asFileLink(r.qcPdf, 'pdffile.png') : null);
544      addColumn('rna.qcRqs', hasQc && r.qcRqs ? formatNumber(r.qcRqs, null, 1) : null);
545      addColumn('rna.qcRin', hasQc && r.qcRin ? formatNumber(r.qcRin, null, 1) : null);
546      addColumn('rna.qcComment', hasQc ? truncate(r.qcComment, truncateAt) : null);
547    }
548  }
549  else
550  {
551    if (consentOk)
552    {
553      addColumn('rna.name', asNoInfo('No RNA information has been registered'));
554      Main.hide('rna-details');
555    }
556    else
557    {
558      Main.hide('rna-info');
559    }
560  }
561
562  var dna = consentOk ? response.dna : null;
563  if (dna && dna.length > 0)
564  {
565    var truncateAt = TRUNCATE_SIZE[Math.min(dna.length-1, TRUNCATE_SIZE.length)];
566    for (var i = 0; i < dna.length; i++)
567    {
568      var d = dna[i];
569      addColumn('dna.name', makeLink('EXTRACT', d));
570      addColumn('dna.registrationDate', formatDate(d.registrationDate));
571      addColumn('dna.storageBox', asBioPlateLocation(d.bioWell));
572      addColumn('dna.extractionDate', formatDate(d.extractionDate));
573      addColumn('dna.extractionProtocol', makeLink('PROTOCOL', d.extractionProtocol, truncateAt));
574      addColumn('dna.remainingQuantity', formatQuantity(d.remainingQuantity, null, ' µg'));
575      addColumn('dna.originalQuantity', formatQuantity(d.originalQuantity, null, ' µg'));
576      addColumn('dna.ndConc', formatQuantity(d.ndConc, null, ' ng/µl'));
577      addColumn('dna.comment', truncate(d.comment, truncateAt));
578    }
579  }
580  else
581  {
582    if (consentOk)
583    {
584      addColumn('dna.name', asNoInfo('No DNA information has been registered'));
585      Main.hide('dna-details');
586    }
587    else
588    {
589      Main.hide('dna-info');
590    }
591  }
592
593  var ft = consentOk ? response.flowThrough : null;
594  if (ft && ft.length > 0)
595  {
596    var truncateAt = TRUNCATE_SIZE[Math.min(ft.length-1, TRUNCATE_SIZE.length)];
597    for (var i = 0; i < ft.length; i++)
598    {
599      var f = ft[i];
600      addColumn('ft.name', makeLink('EXTRACT', f));
601      addColumn('ft.registrationDate', formatDate(f.registrationDate));
602      addColumn('ft.storageBox', asBioPlateLocation(f.bioWell));
603      addColumn('ft.extractionDate', formatDate(f.extractionDate));
604      addColumn('ft.extractionProtocol', makeLink('PROTOCOL', f.extractionProtocol, truncateAt));
605      addColumn('ft.remainingQuantity', formatQuantity(f.remainingQuantity, null, ' µg'));
606      addColumn('ft.originalQuantity', formatQuantity(f.originalQuantity, null, ' µg'));
607      addColumn('ft.comment', truncate(f.comment, truncateAt));
608    }
609  }
610  else
611  {
612    if (consentOk)
613    {
614      addColumn('ft.name', asNoInfo('No FlowThrough information has been registered'));
615      Main.hide('ft-details');
616    }
617    else
618    {
619      Main.hide('ft-info');
620    }
621  }
622
623 
624  var mrna = consentOk ? response.mrna : null;
625  if (mrna && mrna.length > 0)
626  {
627    var truncateAt = TRUNCATE_SIZE[Math.min(mrna.length-1, TRUNCATE_SIZE.length)];
628    for (var i = 0; i < mrna.length; i++)
629    {
630      var r = mrna[i];
631      addColumn('mrna.name', makeLink('EXTRACT', r));
632      addColumn('mrna.registrationDate', formatDate(r.registrationDate));
633      addColumn('mrna.storageBox', asBioPlateLocation(r.bioWell)+asFileLink(r.platePdf, 'pdffile.png'));
634      addColumn('mrna.result', (r.result && r.result != 'Successful') ? asFailInfo(r.result, 'error.png') : null);
635      addColumn('mrna.extractionDate', formatDate(r.extractionDate));
636      addColumn('mrna.usedQuantity', formatQuantity(r.usedQuantity, null, ' µg'));
637    }
638  }
639  else
640  {
641    if (consentOk)
642    {
643      addColumn('mrna.name', asNoInfo('No mRNA information has been registered'));
644      Main.hide('mrna-details');
645    }
646    else
647    {
648      Main.hide('mrna-info');
649    }
650  }
651
652
653  var cdna = consentOk ? response.cdna : null;
654  if (cdna && cdna.length > 0)
655  {
656    var truncateAt = TRUNCATE_SIZE[Math.min(cdna.length-1, TRUNCATE_SIZE.length)];
657    for (var i = 0; i < cdna.length; i++)
658    {
659      var r = cdna[i];
660      addColumn('cdna.name', makeLink('EXTRACT', r));
661      addColumn('cdna.registrationDate', formatDate(r.registrationDate));
662      addColumn('cdna.storageBox', asBioPlateLocation(r.bioWell));
663      addColumn('cdna.result', (r.result && r.result != 'Successful') ? asFailInfo(r.result, 'error.png') : null);
664      addColumn('cdna.extractionDate', formatDate(r.extractionDate));
665    }
666  }
667  else
668  {
669    if (consentOk)
670    {
671      addColumn('cdna.name', asNoInfo('No cDNA information has been registered'));
672      Main.hide('cdna-details');
673    }
674    else
675    {
676      Main.hide('cdna-info');
677    }
678  }
679
680
681  var lib = consentOk ? response.lib : null;
682  if (lib && lib.length > 0)
683  {
684    var truncateAt = TRUNCATE_SIZE[Math.min(lib.length-1, TRUNCATE_SIZE.length)];
685    for (var i = 0; i < lib.length; i++)
686    {
687      var r = lib[i];
688      addColumn('lib.name', makeLink('EXTRACT', r));
689      addColumn('lib.registrationDate', formatDate(r.registrationDate));
690      addColumn('lib.storageBox', asBioPlateLocation(r.bioWell));
691      addColumn('lib.result', (r.result && r.result != 'Successful') ? asFailInfo(r.result, 'error.png') : null);
692      addColumn('lib.extractionDate', formatDate(r.extractionDate));
693      addColumn('lib.remainingQuantity', formatQuantity(r.remainingQuantity, 0.001, ' ng'));
694      addColumn('lib.originalQuantity', formatQuantity(r.originalQuantity, 0.001, ' ng'));
695      addColumn('lib.barcode.name', r.barcode.name);
696      addColumn('lib.ca_size', formatQuantity(r.ca_size, null, ''));
697      addColumn('lib.ca_molarity', formatQuantity(r.ca_molarity, null, ' nM'));
698      addColumn('lib.qubitconc', formatQuantity(r.qubitconc, null, ' ng/µl'));
699    }
700  }
701  else
702  {
703    if (consentOk)
704    {
705      addColumn('lib.name', asNoInfo('No library information has been registered'));
706      Main.hide('lib-details');
707    }
708    else
709    {
710      Main.hide('lib-info');
711    }
712  }
713
714
715  var pooledLib = consentOk ? response.pooledlib : null;
716  if (pooledLib && pooledLib.length > 0)
717  {
718    var truncateAt = TRUNCATE_SIZE[Math.min(pooledLib.length-1, TRUNCATE_SIZE.length)];
719    for (var i = 0; i < pooledLib.length; i++)
720    {
721      var r = pooledLib[i];
722      addColumn('pooledlib.name', makeLink('EXTRACT', r));
723      addColumn('pooledlib.registrationDate', formatDate(r.registrationDate));
724      addColumn('pooledlib.extractionDate', formatDate(r.extractionDate));
725      addColumn('pooledlib.remainingQuantity', formatQuantity(r.remainingQuantity, 0.001, ' ng'));
726      addColumn('pooledlib.originalQuantity', formatQuantity(r.originalQuantity, 0.001, ' ng'));
727      addColumn('pooledlib.poolmolarity', formatQuantity(r.poolmolarity, null, ' nM'));
728      addColumn('pooledlib.poolconc', formatQuantity(r.poolconc, null, ' ng/µl'));
729    }
730  }
731  else
732  {
733    if (consentOk)
734    {
735      addColumn('pooledlib.name', asNoInfo('No pooled library information has been registered'));
736      Main.hide('pooledlib-details');
737    }
738    else
739    {
740      Main.hide('pooledlib-info');
741    }
742  }
743}
744
745function caseSummary(caseName)
746{
747  var frm = document.forms['reggie'];
748  if (!caseName)
749  {
750    caseName = frm.caseName.value;
751    if (!caseName)
752    {
753      alert('Please enter a 7-digit case id');
754      return;
755    }
756  }
757  location.href = 'case_summary.jsp?ID=<%=ID%>&caseName='+encodeURIComponent(caseName);
758}
759
760function showConfidentialOnChange()
761{
762  var frm = document.forms['reggie'];
763  if (frm.showConfidential.checked)
764  {
765    Main.removeClass(document.getElementById('all-info'), 'hide-confidential');
766  }
767  else
768  {
769    Main.addClass(document.getElementById('all-info'), 'hide-confidential');
770  }
771}
772
773function goPrint()
774{
775  var printNote = '<b>Note!</b> For better printing set page orientation to <i>portrait</i>.<br>';
776  printNote += ' You may have to <i>scale down</i> to fit everything on the width of the page.';
777  openPrintWindow('<%=ID%>', 'all-content', 'Case summary - <%=HTML.encodeTags(caseName)%>', 'portrait', printNote, '../', 'case_summary.css');
778}
779
780</script>
781<style>
782
783</style>
784</base:head>
785
786<base:body onload="init()">
787  <div id="all-content">
788  <%
789  if (fullPage)
790  {
791    %>
792    <p:path><p:pathelement id="path-reggie" clazz="noprint"
793      title="Reggie" href="<%="../index.jsp?ID="+ID%>"
794      /><p:pathelement id="path-case-summary" title="<%="Case summary - " + HTML.encodeTags(caseName)%>" 
795      /></p:path>
796    <%
797  }
798  else if (popup)
799  {
800    %>
801    <h1>Case summary - <%= HTML.encodeTags(caseName)%></h1>
802    <%
803  }
804  %>
805  <div class="content">
806  <form name="reggie" onsubmit="return false;">
807  <%
808  if (fullPage || popup)
809  {
810    %>
811    <div class="filled noprint" id="toolbar">
812      <table>
813      <tr>
814        <th style="padding: 0.5em 0.75em 0.5em 0.75em;">Find another case</th>
815        <td><input type="text" class="text" style="width: 25em;"
816          name="caseName" title="Please enter a 7-digit case id"
817          onkeypress="if (event.keyCode==13 && this.value) caseSummary()"></td>
818        <td style="padding-left: 0.5em; padding-right: 0.5em; border-right: 1px dotted #A0A0A0; "><base:icon image="<%=home+"/images/gonext.png"%>" onclick="caseSummary()"></base:icon></td>
819        <%
820        if (isAdmin || isPatientCurator)
821        {
822          %>
823          <th style="padding-left: 0.5em; padding-right: 0.5em; border-right: 1px dotted #A0A0A0;">
824            <label for="showConfidential">Show confidential information</label>
825            <input type="checkbox" id="showConfidential" name="showConfidential" onchange="showConfidentialOnChange()">
826          </th>
827          <%
828        }
829        %>
830        <th style="padding-left: 0.5em; padding-right: 0.5em; border-right: 1px dotted #A0A0A0;">
831          <span id="printButton" class="link" onclick="goPrint()"><img src="../images/print.png" style="padding-right: 0.5em;">Print version&hellip;</span>
832        </th>
833      </tr>
834      </table>
835    </div>
836    <%
837  }
838  %>
839  <div class="hide-confidential" id="all-info" style="display: none;">
840    <div id="left-column">
841      <div>
842        <%
843        if (sc.getActiveProjectId() == 0)
844        {
845          %>
846          <div class="messagecontainer note" style="margin-bottom: 20px; font-weight: bold; color: #cc0000;">
847            No project has been selected. You may not be able to see all registered information.
848          </div>
849          <%
850        }
851        %>
852        <div class="info-section" id="case-info">
853          <div>
854          <table class="info-table">
855          <thead>
856            <tr id="case.name">
857              <th>Case</th>
858            </tr>
859          </thead>
860          <tbody id="case-details">
861            <tr id="case.registrationDate">
862              <th>Registration date</th>
863            </tr>
864            <tr id="case.site">
865              <th>Site</th>
866            </tr>
867            <tr id="case.laterality" class="dynamic-column">
868              <th>Laterality</th>
869            </tr>
870            <tr id="case.consent">
871              <th>Consent</th>
872            </tr>
873            <tr id="case.comment" class="comment dynamic-column">
874              <th>Comment</th>
875            </tr>
876          </tbody>
877          </table>
878          </div>
879        </div>
880
881        <div class="info-section" id="patient-info">
882          <div>
883          <table class="info-table">
884          <thead>
885            <tr id="patient.name">
886              <th>Patient</th>
887            </tr>
888          </thead>
889          <tbody id="patient-details">
890            <tr id="patient.registrationDate">
891              <th>Registration date</th>
892            </tr>
893            <tr id="patient.personalNumber" class="confidential">
894              <th>Personal number</th>
895            </tr>
896            <tr id="patient.allFirstNames" class="confidential">
897              <th>All first names</th>
898            </tr>
899            <tr id="patient.familyName" class="confidential">
900              <th>Family name</th>
901            </tr>
902            <tr id="patient.gender">
903              <th>Gender</th>
904            </tr>
905            <tr id="patient.allCases" class="dynamic-column">
906              <th>All cases</th>
907            </tr>
908          </tbody>
909          </table>
910          </div>
911        </div>
912
913        <div class="info-section" id="blood-info">
914          <div>
915          <table class="info-table">
916          <thead>
917            <tr id="blood.name">
918              <th>Blood</th>
919            </tr>
920          </thead>
921          <tbody id="blood-details">
922            <tr id="blood.registrationDate">
923              <th>Registration date</th>
924            </tr>
925            <tr id="blood.consent">
926              <th>Consent</th>
927            </tr>
928            <tr id="blood.bloodSample">
929              <th>Blood sample</th>
930            </tr>
931            <tr id="blood.samplingDate">
932              <th>Sampling date</th>
933            </tr>
934            <tr id="blood.freezerDate">
935              <th>Freezer date</th>
936            </tr>
937            <tr id="blood.serum">
938              <th>Serum</th>
939            </tr>
940            <tr id="blood.comment" class="comment dynamic-column">
941              <th>Comment</th>
942            </tr>
943          </tbody>
944          </table>
945          </div>
946        </div>
947       
948        <div class="info-section" id="specimen-info">
949          <div>
950          <table class="info-table">
951          <thead>
952            <tr id="specimen.name">
953              <th>Specimen</th>
954            </tr>
955          </thead>
956          <tbody id="specimen-details">
957            <tr id="specimen.registrationDate">
958              <th>Registration date</th>
959            </tr>
960            <tr id="specimen.storageBox">
961              <th>Storage box</th>
962            </tr>
963            <tr id="specimen.laterality">
964              <th>Laterality</th>
965            </tr>
966            <tr id="specimen.samplingDate">
967              <th>Sampling date</th>
968            </tr>
969            <tr id="specimen.rnaLaterDate">
970              <th>RNA later date</th>
971            </tr>
972            <tr id="specimen.pad">
973              <th>PAD</th>
974            </tr>
975            <tr id="specimen.biopsyType">
976              <th>Biopsy type</th>
977            </tr>
978            <tr id="specimen.remainingQuantity">
979              <th>Remaining quantity</th>
980            </tr>
981            <tr id="specimen.originalQuantity">
982              <th>Original quantity</th>
983            </tr>
984            <tr id="specimen.nofPieces">
985              <th>No. pieces</th>
986            </tr>
987            <tr id="specimen.partitionComment">
988              <th>Partition comment</th>
989            </tr>
990            <tr id="specimen.comment" class="comment dynamic-column">
991              <th>Comment</th>
992            </tr>
993          </tbody>
994          </table>
995          </div>
996        </div>
997       
998        <div class="info-section" id="nospecimen-info">
999          <div>
1000          <table class="info-table">
1001          <thead>
1002            <tr id="nospecimen.name">
1003              <th>NoSpecimen</th>
1004            </tr>
1005          </thead>
1006          <tbody id="nospecimen-details">
1007            <tr id="nospecimen.registrationDate">
1008              <th>Registration date</th>
1009            </tr>
1010            <tr id="nospecimen.laterality">
1011              <th>Laterality</th>
1012            </tr>
1013            <tr id="nospecimen.samplingDate">
1014              <th>Sampling date</th>
1015            </tr>
1016            <tr id="nospecimen.pad">
1017              <th>PAD</th>
1018            </tr>
1019            <tr id="nospecimen.reasonIfNoSpecimen" class="comment">
1020              <th>Reason</th>
1021            </tr>
1022            <tr id="nospecimen.comment" class="comment dynamic-column">
1023              <th>Comment</th>
1024            </tr>
1025          </tbody>
1026          </table>
1027          </div>
1028        </div>
1029     
1030      </div>
1031    </div>
1032    <div id="right-column">
1033      <div>
1034        <div class="info-section" id="histology-info">
1035          <div>
1036          <table class="info-table">
1037          <thead>
1038            <tr id="histology.name">
1039              <th>Histology</th>
1040            </tr>
1041          </thead>
1042          <tbody id="histology-details">
1043            <tr id="histology.registrationDate">
1044              <th>Registration date</th>
1045            </tr>
1046            <tr id="histology.storageBox" class="dynamic-column">
1047              <th>Storage box</th>
1048            </tr>
1049            <tr id="histology.partitionDate">
1050              <th>Partition date</th>
1051            </tr>
1052            <tr id="histology.usedQuantity">
1053              <th>Used quantity</th>
1054            </tr>
1055            <tr id="histology.embedded" class="subtitle">
1056              <th>Embedded</th>
1057            </tr>
1058            <tr id="histology.paraffinBlock" class="dynamic-column">
1059              <th>Paraffin block</th>
1060            </tr>
1061            <tr id="histology.embedProtocol" class="dynamic-column">
1062              <th>Protocol</th>
1063            </tr>
1064            <tr id="histology.stained" class="subtitle">
1065              <th>Stained</th>
1066            </tr>
1067            <tr id="histology.nofSlides" class="dynamic-column">
1068              <th>No. slides</th>
1069            </tr>
1070            <tr id="histology.heGlass" class="dynamic-column">
1071              <th>Best slide</th>
1072            </tr>
1073            <tr id="histology.stainProtocol" class="dynamic-column">
1074              <th>Protocol</th>
1075            </tr>
1076          </tbody>
1077          </table>
1078          </div>
1079        </div>
1080
1081        <div class="info-section" id="lysate-info">
1082          <div>
1083          <table class="info-table dynamic-columns">
1084          <thead>
1085            <tr id="lysate.name">
1086              <th>Lysate</th>
1087            </tr>
1088          </thead>
1089          <tbody id="lysate-details">
1090            <tr id="lysate.registrationDate">
1091              <th>Registration date</th>
1092            </tr>
1093            <tr id="lysate.partitionDate">
1094              <th>Partition date</th>
1095            </tr>
1096            <tr id="lysate.usedQuantity">
1097              <th>Used quantity</th>
1098            </tr>
1099            <tr id="lysate.multiplePieces">
1100              <th>Multiple pieces</th>
1101            </tr>
1102            <tr id="lysate.lysisDate" class="subtitle">
1103              <th>Lysis date</th>
1104            </tr>
1105            <tr id="lysate.storageBox" class="dynamic-column">
1106              <th>Storage box</th>
1107            </tr>
1108            <tr id="lysate.lysisProtocol" class="dynamic-column">
1109              <th>Protocol</th>
1110            </tr>
1111            <tr id="lysate.remainingQuantity" class="dynamic-column">
1112              <th>Remaining quantity</th>
1113            </tr>
1114            <tr id="lysate.originalQuantity" class="dynamic-column">
1115              <th>Original quantity</th>
1116            </tr>
1117            <tr id="lysate.comment" class="comment dynamic-column">
1118              <th>Comment</th>
1119            </tr>
1120          </tbody>
1121          </table>
1122          </div>
1123        </div>
1124         
1125        <div class="info-section" id="rna-info">
1126          <div>
1127          <table class="info-table dynamic-columns">
1128          <thead>
1129            <tr id="rna.name">
1130              <th>RNA</th>
1131            </tr>
1132          </thead>
1133          <tbody id="rna-details">
1134            <tr id="rna.flag" class="dynamic-column">
1135              <th>Flag</th>
1136            </tr>
1137            <tr id="rna.registrationDate">
1138              <th>Registration date</th>
1139            </tr>
1140            <tr id="rna.storageBox">
1141              <th>Storage box</th>
1142            </tr>
1143            <tr id="rna.extractionDate">
1144              <th>Extraction date</th>
1145            </tr>
1146            <tr id="rna.usedQuantity">
1147              <th>Used quantity</th>
1148            </tr>
1149            <tr id="rna.extractionProtocol">
1150              <th>Protocol</th>
1151            </tr>
1152            <tr id="rna.remainingQuantity">
1153              <th>Remaining quantity</th>
1154            </tr>
1155            <tr id="rna.originalQuantity">
1156              <th>Original quantity</th>
1157            </tr>
1158            <tr id="rna.ndConc">
1159              <th>ND Conc.</th>
1160            </tr>
1161            <tr id="rna.comment" class="comment dynamic-column">
1162              <th>Comment</th>
1163            </tr>
1164            <tr id="rna.qc" class="subtitle">
1165              <th>QC (last)</th>
1166            </tr>
1167            <tr id="rna.nofQc" class="dynamic-column">
1168              <th>No. QC</th>
1169            </tr>
1170            <tr id="rna.qcProtocol" class="dynamic-column">
1171              <th>Protocol</th>
1172            </tr>
1173            <tr id="rna.qcPlate" class="dynamic-column">
1174              <th>Plate</th>
1175            </tr>
1176            <tr id="rna.qcRqs" class="dynamic-column">
1177              <th>RQS</th>
1178            </tr>
1179            <tr id="rna.qcRin" class="dynamic-column">
1180              <th>RIN</th>
1181            </tr>
1182            <tr id="rna.qcComment" class="comment dynamic-column">
1183              <th>Comment</th>
1184            </tr>
1185          </tbody>
1186          </table>
1187          </div>
1188        </div>
1189
1190        <div class="info-section" id="dna-info">
1191          <div>
1192          <table class="info-table dynamic-columns">
1193          <thead>
1194            <tr id="dna.name">
1195              <th>DNA</th>
1196            </tr>
1197          </thead>
1198          <tbody id="dna-details">
1199            <tr id="dna.registrationDate">
1200              <th>Registration date</th>
1201            </tr>
1202            <tr id="dna.storageBox">
1203              <th>Storage box</th>
1204            </tr>
1205            <tr id="dna.extractionDate">
1206              <th>Extraction date</th>
1207            </tr>
1208            <tr id="dna.extractionProtocol">
1209              <th>Protocol</th>
1210            </tr>
1211            <tr id="dna.remainingQuantity">
1212              <th>Remaining quantity</th>
1213            </tr>
1214            <tr id="dna.originalQuantity">
1215              <th>Original quantity</th>
1216            </tr>
1217            <tr id="dna.ndConc">
1218              <th>ND Conc.</th>
1219            </tr>
1220            <tr id="dna.comment" class="comment dynamic-column">
1221              <th>Comment</th>
1222            </tr>
1223          </tbody>
1224          </table>
1225          </div>
1226        </div>
1227
1228        <div class="info-section" id="ft-info">
1229          <div>
1230          <table class="info-table dynamic-columns">
1231          <thead>
1232            <tr id="ft.name">
1233              <th>FlowThrough</th>
1234            </tr>
1235          </thead>
1236          <tbody id="ft-details">
1237            <tr id="ft.registrationDate">
1238              <th>Registration date</th>
1239            </tr>
1240            <tr id="ft.storageBox">
1241              <th>Storage box</th>
1242            </tr>
1243            <tr id="ft.extractionDate">
1244              <th>Extraction date</th>
1245            </tr>
1246            <tr id="ft.extractionProtocol">
1247              <th>Protocol</th>
1248            </tr>
1249            <tr id="ft.remainingQuantity">
1250              <th>Remaining quantity</th>
1251            </tr>
1252            <tr id="ft.originalQuantity">
1253              <th>Original quantity</th>
1254            </tr>
1255            <tr id="ft.comment" class="comment dynamic-column">
1256              <th>Comment</th>
1257            </tr>
1258          </tbody>
1259          </table>
1260          </div>
1261        </div>
1262       
1263        <div class="info-section" id="mrna-info">
1264          <div>
1265          <table class="info-table dynamic-columns">
1266          <thead>
1267            <tr id="mrna.name">
1268              <th>mRNA</th>
1269            </tr>
1270          </thead>
1271          <tbody id="mrna-details">
1272            <tr id="mrna.registrationDate">
1273              <th>Registration date</th>
1274            </tr>
1275            <tr id="mrna.storageBox">
1276              <th>Work plate</th>
1277            </tr>
1278            <tr id="mrna.result" class="dynamic-column">
1279              <th>Plate result</th>
1280            </tr>
1281            <tr id="mrna.extractionDate">
1282              <th>Cleanup date</th>
1283            </tr>
1284            <tr id="mrna.usedQuantity">
1285              <th>Used quantity</th>
1286            </tr>
1287          </tbody>
1288          </table>
1289          </div>
1290        </div>
1291       
1292        <div class="info-section" id="cdna-info">
1293          <div>
1294          <table class="info-table dynamic-columns">
1295          <thead>
1296            <tr id="cdna.name">
1297              <th>cDNA</th>
1298            </tr>
1299          </thead>
1300          <tbody id="cdna-details">
1301            <tr id="cdna.registrationDate">
1302              <th>Registration date</th>
1303            </tr>
1304            <tr id="cdna.storageBox">
1305              <th>Work plate</th>
1306            </tr>
1307            <tr id="cdna.result" class="dynamic-column">
1308              <th>Plate result</th>
1309            </tr>
1310            <tr id="cdna.extractionDate">
1311              <th>Synthesis date</th>
1312            </tr>
1313          </tbody>
1314          </table>
1315          </div>
1316        </div>
1317       
1318        <div class="info-section" id="lib-info">
1319          <div>
1320          <table class="info-table dynamic-columns">
1321          <thead>
1322            <tr id="lib.name">
1323              <th>Library</th>
1324            </tr>
1325          </thead>
1326          <tbody id="lib-details">
1327            <tr id="lib.registrationDate">
1328              <th>Registration date</th>
1329            </tr>
1330            <tr id="lib.storageBox">
1331              <th>Library plate</th>
1332            </tr>
1333            <tr id="lib.result" class="dynamic-column">
1334              <th>Plate result</th>
1335            </tr>
1336            <tr id="lib.extractionDate">
1337              <th>Cleanup date</th>
1338            </tr>
1339            <tr id="lib.remainingQuantity">
1340              <th>Remaining quantity</th>
1341            </tr>
1342            <tr id="lib.originalQuantity">
1343              <th>Original quantity</th>
1344            </tr>
1345            <tr id="lib.barcode.name">
1346              <th>Tag</th>
1347            </tr>
1348            <tr id="lib.ca_size">
1349              <th>CA_Size</th>
1350            </tr>
1351            <tr id="lib.ca_molarity">
1352              <th>CA_Molarity</th>
1353            </tr>
1354            <tr id="lib.qubitconc">
1355              <th>QubitConc</th>
1356            </tr>
1357          </tbody>
1358          </table>
1359          </div>
1360        </div>
1361       
1362        <div class="info-section" id="pooledlib-info">
1363          <div>
1364          <table class="info-table dynamic-columns">
1365          <thead>
1366            <tr id="pooledlib.name">
1367              <th>Pooled Library</th>
1368            </tr>
1369          </thead>
1370          <tbody id="pooledlib-details">
1371            <tr id="pooledlib.registrationDate">
1372              <th>Registration date</th>
1373            </tr>
1374            <tr id="pooledlib.extractionDate">
1375              <th>Pool date</th>
1376            </tr>
1377            <tr id="pooledlib.remainingQuantity">
1378              <th>Remaining quantity</th>
1379            </tr>
1380            <tr id="pooledlib.originalQuantity">
1381              <th>Original quantity</th>
1382            </tr>
1383            <tr id="pooledlib.poolmolarity">
1384              <th>PoolMolarity</th>
1385            </tr>
1386            <tr id="pooledlib.poolconc">
1387              <th>PoolConc</th>
1388            </tr>
1389          </tbody>
1390          </table>
1391          </div>
1392        </div>
1393       
1394      </div>
1395    </div>
1396  </div>
1397  </form>
1398 
1399  <div class="messagecontainer error" id="errorMessage" style="display: none; width: 950px; margin-left: 20px; margin-bottom: 0px;"></div>
1400
1401  </div>
1402  </div>
1403  <%
1404  if (popup)
1405  {
1406    %>
1407    <base:buttongroup subclass="dialogbuttons topborder" id="dialogbuttons">
1408      <base:button onclick="window.close()" title="Close" />
1409    </base:buttongroup>
1410    <%
1411  }
1412  %>
1413</base:body>
1414</base:page>
1415<%
1416}
1417finally
1418{
1419  if (dc != null) dc.close();
1420}
1421%>
Note: See TracBrowser for help on using the repository browser.