source: extensions/net.sf.basedb.reggie/trunk/resources/samplereportgenerator.jsp @ 1737

Last change on this file since 1737 was 1737, checked in by olle, 9 years ago

Fixes #428. Refs #420. Refs #426. Sample count report and consent count report updated to show a table column with latest item dates for each site.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 43.0 KB
Line 
1<%@ page
2  pageEncoding="UTF-8"
3  session="false"
4  import="net.sf.basedb.core.User"
5  import="net.sf.basedb.core.DbControl"
6  import="net.sf.basedb.core.SessionControl"
7  import="net.sf.basedb.core.Application"
8  import="net.sf.basedb.clients.web.Base" 
9  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
10%>
11<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
12<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
13<%
14final SessionControl sc = Base.getExistingSessionControl(request, true);
15final String ID = sc.getId();
16final float scale = Base.getScale(sc);
17final String home = ExtensionsControl.getHomeUrl("net.sf.basedb.reggie");
18DbControl dc = null;
19try
20{
21  dc = sc.newDbControl();
22  final User user = User.getById(dc, sc.getLoggedInUserId());
23  %>
24<base:page type="default" >
25<base:head scripts="ajax.js" styles="path.css">
26  <link rel="stylesheet" type="text/css" href="css/reggie.css">
27  <script language="JavaScript" src="reggie.js" type="text/javascript" charset="UTF-8"></script>
28   
29   
30  <script language="JavaScript">
31  var currentStep = 1;
32  var debug = false;
33  var numCols;
34  var unknownSite = 0;
35  var unknownCreation;
36 
37  var month=new Array(12);
38    month[0]="Jan";
39    month[1]="Feb";
40    month[2]="Mar";
41    month[3]="Apr";
42    month[4]="May";
43    month[5]="Jun";
44    month[6]="Jul";
45    month[7]="Aug";
46    month[8]="Sep";
47    month[9]="Oct";
48    month[10]="Nov";
49    month[11]="Dec";
50 
51  var intervalIsValid = true;
52 
53  function goNext()
54  {
55    if (currentStep == 1)
56    {
57      gotoStep2();
58    }
59  }
60 
61  function gotoStep2()
62  {
63    var frm = document.forms['reggie'];
64    frm.reporttype.disabled = true;
65    if (frm.reporttype[frm.reporttype.selectedIndex].value == 'samplecount')
66    {
67      Main.show('sampleCountSection');
68    }
69    else if (frm.reporttype[frm.reporttype.selectedIndex].value == 'consentcount')
70    {
71      Main.show('consentCountSection');
72    }
73       
74    Main.show('gocreate');   
75    Main.hide('gonext');
76    frm.fromdate.focus();
77    currentStep = 2;
78  }
79 
80  function dateOnChange()
81  {
82    var frm = document.forms['reggie'];   
83    var fdate;
84    var tdate;
85   
86    intervalIsValid = false;
87    setInputStatus('displayInterval','','valid');
88    if (frm.fromdate.value != null && frm.fromdate.value != '')
89    {
90      frm.fromdate.value = autoFillDate(frm.fromdate.value);     
91      if (!Dates.isDate(frm.fromdate.value, 'yyyyMMdd'))
92      {
93        setInputStatus('displayInterval','Not a valid from-date', 'invalid');
94        return;
95      }
96      else
97      {
98        fdate = frm.fromdate.value;
99        fdate = new Date(fdate.substr(0,4), parseInt(fdate.substr(4,2), 10)-1, fdate.substr(6,2));
100      }
101    }
102   
103    if (frm.todate.value != null && frm.todate.value != '')
104    {
105      frm.todate.value = autoFillDate(frm.todate.value);
106      if (!Dates.isDate(frm.todate.value, 'yyyyMMdd'))
107      {
108        setInputStatus('displayInterval', 'Not a valid to-date', 'invalid');
109        return;
110      }
111      else
112      {
113        tdate = frm.todate.value;
114        tdate = new Date(tdate.substr(0,4), parseInt(tdate.substr(4,2), 10)-1, tdate.substr(6,2));
115      }
116    }
117   
118    if (tdate != null && fdate != null)
119    {
120      if (fdate > tdate)
121      {
122        setInputStatus('displayInterval', 'Invalid period', 'invalid')
123        return;
124      }     
125    }
126    intervalIsValid = true;
127  }
128 
129  function goCreate()
130  {
131    if (!intervalIsValid) return;
132    var cellElement = document.getElementById('reportcell');
133    var frm = document.forms['reggie'];   
134    frm.fromdate.disabled = true;
135    frm.todate.disabled = true;
136    frm.viewtype.disabled = true;
137    Main.hide('gocreate');
138    Main.show('reportSection');
139    var reportType = frm.reporttype[frm.reporttype.selectedIndex].value;   
140    var url = 'SampleReport.servlet?ID=<%=ID%>&cmd='+reportType;   
141   
142    if (reportType == 'samplecount')
143    {     
144      if (frm.fromdate.value != null) url += '&fdate='+frm.fromdate.value;
145      if (frm.todate.value != null) url += '&tdate='+frm.todate.value;
146      if (frm.viewtype.value != null) url += '&vtype='+frm.viewtype.value;
147    }
148    var request = Ajax.getXmlHttpRequest();
149    request.open("GET", url, false);
150    request.send(null);
151   
152    if (debug) Main.debug(request.responseText);   
153    var response = JSON.parse(request.responseText); 
154    if (response.status != 'ok')
155    {
156      setFatalError(response.message);
157      return false;
158    }
159    var report = response.report;
160    var reportTable;
161   
162    if (report != null)
163    {
164      if ('samplecount' == reportType)
165      {     
166        reportTable = createSampleCountReport(report);
167      }
168      else if ('consentcount' == reportType)
169      {     
170        reportTable = createConsentCountReport(report);
171      }
172    }
173    else
174    {
175      var messageCell = getTableCellElement('No values could be found during given period', 'reportheader');
176      var messageRow = document.createElement('tr');
177      messageRow.appendChild(messageCell);     
178      var messageTable = getReportTable();
179      messageTable.appendChild(messageRow);
180      reportTable = messageTable;     
181    }
182    setInnerHTML('reportcell', '');
183    cellElement.appendChild(reportTable);
184    var summaryList = document.createElement('ul');
185    if (unknownSite == null) unknownSite = 0;
186    if (unknownCreation == null) unknownCreation = 0;
187    if ('samplecount' == reportType)
188    {     
189      summaryList.appendChild(getListElement(unknownSite + ' specimens registered to unknown sites.'));
190      summaryList.appendChild(getListElement(unknownCreation + ' specimens without creation date. These are included in the \'Total\' column.'));
191    }
192    else if ('consentcount' == reportType)
193    {
194      var numDuplicates = 0;
195      if (report != null)
196      {
197        var statistics = report.statistics;
198        numDuplicates = statistics.duplicateKey;
199      }
200      if (numDuplicates == null)
201      {
202        numDuplicates = 0;
203      }
204      summaryList.appendChild(getListElement(unknownSite + ' consents registered to unknown sites.'));
205      summaryList.appendChild(getListElement(unknownCreation + ' consents without known date.'));
206      summaryList.appendChild(getListElement(numDuplicates + ' duplicates ignored.'));
207
208      var patientsWithMultipleDates = statistics.patientsWithMultipleDatesKey;
209      var counter = 0;
210      for (var key in patientsWithMultipleDates)
211      {
212        counter++;
213      }
214      var patientsWithMultipleDatesText = counter + ' patients with multiple dates.';
215      summaryList.appendChild(getListElement(patientsWithMultipleDatesText));
216    }
217    cellElement.appendChild(summaryList);
218    if ('consentcount' == reportType)
219    {
220      // Add table with patients with consents with multiple dates
221      var multipleDatesTable = createConsentTablePatientsWithMultipleDates(report);
222      cellElement.appendChild(multipleDatesTable);
223    }
224    Main.show('gorestart');   
225  }
226 
227  function createSampleCountReport(report)
228  {
229    var reportTable = getReportTable();
230    var sdString = report.beginDate;
231    var edString = report.endDate;
232    var psdString = report.periodBeginDate;
233    var ldString = report.latestDate;
234    var startDate = new Date();
235    startDate.setYear(sdString.substr(0,4));
236    startDate.setMonth(sdString.substr(4,2)-1);
237    startDate.setDate(sdString.substr(6));
238    var endDate = new Date();
239    endDate.setYear(edString.substr(0,4));
240    endDate.setMonth(edString.substr(4,2)-1);
241    endDate.setDate(edString.substr(6));
242    var periodStartDate = new Date();
243    periodStartDate.setYear(psdString.substr(0,4));
244    periodStartDate.setMonth(psdString.substr(4,2)-1);
245    periodStartDate.setDate(psdString.substr(6));
246    var latestDate;
247    if (ldString != null)
248    {
249      latestDate = new Date();
250      latestDate.setYear(ldString.substr(0,4));
251      latestDate.setMonth(ldString.substr(4,2)-1);
252      latestDate.setDate(ldString.substr(6));
253    }   
254   
255    var viewType = report.viewType;   
256 
257    var headerRow = document.createElement('tr');   
258    var subHeaderRowYear = document.createElement('tr');
259    var columnHeaderRow = document.createElement('tr');
260   
261    var headerText = '# Specimen by ';
262    if (viewType == 'WEEK')
263    {
264      var startWeek = getISOWeekNumber(periodStartDate);
265      var endWeek = getISOWeekNumber(endDate);
266      var tempDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate()-periodStartDate.getDay()+1);
267      numCols = 0;
268      while (tempDate < endDate)
269      {
270        numCols++;
271        tempDate.setDate(tempDate.getDate()+7);
272      }
273      headerText += 'week';
274    }
275    else if (viewType == 'MONTH')
276    {
277      numCols = (endDate.getFullYear()-periodStartDate.getFullYear())*12 + endDate.getMonth()-periodStartDate.getMonth()+1;
278      headerText += 'month';
279    }
280    else if (viewType == 'QUARTER')
281    {
282      //First year
283      numCols = 4 - Math.floor(periodStartDate.getMonth()/3);
284      numCols += Math.floor(endDate.getMonth()/3)+1;
285      if((endDate.getFullYear() - periodStartDate.getFullYear()) > 1)
286      {
287        numCols += 4 * (endDate.getFullYear() - periodStartDate.getFullYear()-1);
288      }
289      headerText += 'quarter';
290    }
291    else
292    {
293      numCols = endDate.getFullYear() - periodStartDate.getFullYear() + 1;
294      headerText += 'year';
295    }
296     
297    // Set table header
298    headerText += ' (between ' + startDate.getFullYear()+'-';
299    if ((startDate.getMonth()+1) < 10)
300    {
301      headerText += '0' + (startDate.getMonth()+1);
302    }
303    else
304    {
305      headerText += (startDate.getMonth()+1);
306    }
307    headerText += '-';
308    if (startDate.getDate() < 10)
309    {
310      headerText += '0' + startDate.getDate();
311    }
312    else
313    {
314      headerText += startDate.getDate();
315    }
316    headerText += ' and ';
317    headerText += endDate.getFullYear()+'-';
318    if ((endDate.getMonth()+1) < 10)
319    {
320      headerText += '0' + (endDate.getMonth()+1);
321    }
322    else
323    {
324      headerText += (endDate.getMonth()+1);
325    }
326    headerText += '-';
327    if (endDate.getDate() < 10)
328    {
329      headerText += '0' + endDate.getDate();
330    }
331    else
332    {
333      headerText += endDate.getDate();
334    }
335    headerText += ')';
336    if (latestDate != null)
337    {
338      headerText += '\nLast registration ' + latestDate.getFullYear();
339      headerText += '-';
340      if ((latestDate.getMonth()+1) < 10)
341      {
342        headerText += '0';
343      }
344      headerText += (latestDate.getMonth()+1);
345      headerText += '-';
346      if (latestDate.getDate()<10)
347      {
348        headerText += '0';
349      }
350      headerText += latestDate.getDate();
351    }   
352    headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+5)));
353   
354    // Sub headers
355    // Only if each datacol is less then a year
356    if (viewType != 'YEAR')
357    {
358      subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader', 3));
359      addYearSubHeaders(periodStartDate, endDate, subHeaderRowYear, viewType);     
360      subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader', 2));
361    }   
362         
363    // Columnsheader   
364    var siteHeader = getTableCellElement('Site', 'reportsubheader');     
365    var startDateHeader = getTableCellElement('Start date','reportsubheader');
366    var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
367    columnHeaderRow.appendChild(siteHeader);
368    columnHeaderRow.appendChild(startDateHeader); 
369    columnHeaderRow.appendChild(latestDateHeader); 
370   
371    if (viewType == 'MONTH') addMonthColumnHeaders(columnHeaderRow, periodStartDate);
372    else if (viewType == 'WEEK') addWeekColumnHeaders(columnHeaderRow, periodStartDate);
373    else if (viewType == 'QUARTER') addQuarterColumnHeaders(columnHeaderRow, periodStartDate);
374    else if (viewType == 'YEAR') addYearSubHeaders(periodStartDate, endDate, columnHeaderRow, viewType);
375   
376   
377    columnHeaderRow.appendChild(getTableCellElement('Sum', 'reportsubheader'));
378    columnHeaderRow.appendChild(getTableCellElement('Total', 'reportsubheader'));
379
380    // Build table     
381    reportTable.appendChild(headerRow);
382    reportTable.appendChild(subHeaderRowYear);
383    reportTable.appendChild(columnHeaderRow);
384         
385    // Data rows     
386    addDataRowsToTable(report, reportTable);
387     
388    // Add a row with the combined numbers for all sites for each period
389    var sitesCombinedRow = document.createElement('tr');
390    sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
391    sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary', 2));
392    // Get combined numbers for all sites for each period
393    var statistics = report.statistics;
394    var sitesCombined = statistics.sitesCombinedKey;   
395    var sortedKeyArray = createSortedPeriodArray(report, numCols);
396    var key;
397    for (arrayIndex in sortedKeyArray)
398    {
399      key = sortedKeyArray[arrayIndex];
400      var data = getJSONData(sitesCombined, key);
401      // Add entry with sample sum for site for selected time period
402      sitesCombinedRow.appendChild(getTableCellElement(data,'colsummary'));
403    }
404    // Get total number of samples for site for the selected time period
405    var sum = statistics.sumKey;
406    // Add entry with total number of samples for site for the selected time period
407    sitesCombinedRow.appendChild(getTableCellElement(sum, 'colsummary'));
408    // Get total number of samples for all sites, regardless of creation date
409    var total = statistics.totalKey;
410    // Add entry with total number of samples for all sites, regardless of creation date
411    sitesCombinedRow.appendChild(getTableCellElement(total, 'colsummary'));
412    reportTable.appendChild(sitesCombinedRow); 
413
414    return reportTable;
415  }
416 
417  function createConsentCountReport(report)
418  {
419    var reportTable = getReportTable();
420/*
421    var sdString = report.beginDate;
422    var edString = report.endDate;
423    var psdString = report.periodBeginDate;
424    var ldString = report.latestDate;
425    var startDate = new Date();
426    startDate.setYear(sdString.substr(0,4));
427    startDate.setMonth(sdString.substr(4,2)-1);
428    startDate.setDate(sdString.substr(6));
429    var endDate = new Date();
430    endDate.setYear(edString.substr(0,4));
431    endDate.setMonth(edString.substr(4,2)-1);
432    endDate.setDate(edString.substr(6));
433    var periodStartDate = new Date();
434    periodStartDate.setYear(psdString.substr(0,4));
435    periodStartDate.setMonth(psdString.substr(4,2)-1);
436    periodStartDate.setDate(psdString.substr(6));
437    var latestDate;
438    if (ldString != null)
439    {
440      latestDate = new Date();
441      latestDate.setYear(ldString.substr(0,4));
442      latestDate.setMonth(ldString.substr(4,2)-1);
443      latestDate.setDate(ldString.substr(6));
444    }   
445   
446    var viewType = report.viewType; 
447*/ 
448 
449    var headerRow = document.createElement('tr');   
450    var subHeaderRow = document.createElement('tr');
451    var columnHeaderRow = document.createElement('tr');
452   
453    var numCols = 8;
454    var numDecimals = 0;
455    var headerText = '# Consent forms of different types for cases and blood samples';
456    headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+4)));
457   
458    // Subheader   
459    subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
460    subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 2));
461   
462    //subHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
463    subHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
464    subHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
465    subHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
466    subHeaderRow.appendChild(getTableCellElement('No', 'reportsubheader'));
467    subHeaderRow.appendChild(getTableCellElement('No', 'reportsubheader'));
468    subHeaderRow.appendChild(getTableCellElement('Not asked', 'reportsubheader'));
469    subHeaderRow.appendChild(getTableCellElement('Not asked', 'reportsubheader'));
470    //subHeaderRow.appendChild(getTableCellElement('Other', 'reportsubheader'));
471    subHeaderRow.appendChild(getTableCellElement('Missing', 'reportsubheader'));
472    subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
473    //subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
474
475    // Columnsheader   
476    var siteHeader = getTableCellElement('Site', 'reportsubheader');     
477    var startDateHeader = getTableCellElement('Start date','reportsubheader');
478    var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
479    columnHeaderRow.appendChild(siteHeader);
480    columnHeaderRow.appendChild(startDateHeader); 
481    columnHeaderRow.appendChild(latestDateHeader); 
482   
483    //columnHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
484    columnHeaderRow.appendChild(getTableCellElement('date, PAT#', 'reportsubheader'));
485    columnHeaderRow.appendChild(getTableCellElement('date, no PAT#', 'reportsubheader'));
486    columnHeaderRow.appendChild(getTableCellElement('no date', 'reportsubheader'));
487    columnHeaderRow.appendChild(getTableCellElement('date', 'reportsubheader'));
488    columnHeaderRow.appendChild(getTableCellElement('no date', 'reportsubheader'));
489    columnHeaderRow.appendChild(getTableCellElement('date', 'reportsubheader'));
490    columnHeaderRow.appendChild(getTableCellElement('no date', 'reportsubheader'));
491    //columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
492    columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
493    columnHeaderRow.appendChild(getTableCellElement('Sum', 'reportsubheader'));
494    //columnHeaderRow.appendChild(getTableCellElement('Total', 'reportsubheader'));
495
496    // Build table     
497    reportTable.appendChild(headerRow);
498    reportTable.appendChild(subHeaderRow);
499    reportTable.appendChild(columnHeaderRow);
500         
501    // Data rows     
502    addDataRowsToConsentTable(report, reportTable);
503     
504    // Add a row with the combined numbers for all sites for each period
505    var sitesCombinedRow = document.createElement('tr');
506    sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
507    sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary', 2));
508    // Get combined numbers for all sites for each period
509    var sumKey = 'sumKey';
510    var statistics = report.statistics;
511    var sitesCombined = statistics.sitesCombinedKey;
512    if (sitesCombined != null)
513    {
514      //data = getJSONDataRightPadded(sitesCombined, 'yes', sumKey, numDecimals);
515      //sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
516      data = getJSONDataWithPercent(sitesCombined, 'yesPatient', sumKey, numDecimals);
517      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
518      data = getJSONDataWithPercent(sitesCombined, 'yesNoPatient', sumKey, numDecimals);
519      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
520      data = getJSONDataWithPercent(sitesCombined, 'yesNoDate', sumKey, numDecimals);
521      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
522      data = getJSONDataWithPercent(sitesCombined, 'no', sumKey, numDecimals);
523      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
524      data = getJSONDataWithPercent(sitesCombined, 'noNoDate', sumKey, numDecimals);
525      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
526      data = getJSONDataWithPercent(sitesCombined, 'notAsked', sumKey, numDecimals);
527      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
528      data = getJSONDataWithPercent(sitesCombined, 'notAskedNoDate', sumKey, numDecimals);
529      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
530      //data = getJSONDataWithPercent(sitesCombined, 'other', sumKey, numDecimals);
531      //sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
532      data = getJSONDataWithPercent(sitesCombined, 'missing', sumKey, numDecimals);
533      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
534    }
535    // Add entry with total number of consents with chosen restrictions
536    data = getJSONData(sitesCombined, sumKey);
537    sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
538/*
539    // Add entry with total number of consents, regardless of restrictions
540    data = getJSONData(sitesCombined, totalKey);
541    sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
542*/
543    reportTable.appendChild(sitesCombinedRow); 
544
545    return reportTable;
546  }
547 
548  function createConsentTablePatientsWithMultipleDates(report)
549  {
550    var multipleDatesTable = getReportTable();
551    var headerRow = document.createElement('tr');   
552    var columnHeaderRow = document.createElement('tr');
553   
554    // Table header
555    var numCols = 3;
556    var headerText = 'Consent forms with multiple dates for same patient';
557    headerRow.appendChild(getTableCellElement(headerText, 'reportheader', numCols));
558   
559    // Columnsheader
560    columnHeaderRow.appendChild(getTableCellElement('Patient ID', 'reportsubheader'));
561    columnHeaderRow.appendChild(getTableCellElement('Date 1', 'reportsubheader'));
562    columnHeaderRow.appendChild(getTableCellElement('Date 2', 'reportsubheader'));
563
564    // Build table     
565    multipleDatesTable.appendChild(headerRow);
566    multipleDatesTable.appendChild(columnHeaderRow);
567         
568    // Data rows
569    if (report != null)
570    {
571      var statistics = report.statistics;
572      var sessionId = statistics.sessionIdKey;
573      var patientsWithMultipleDates = statistics.patientsWithMultipleDatesKey;
574      var patientnamePatientid = statistics.patientnamePatientidKey;
575      for (var patientName in patientsWithMultipleDates)
576      {
577        var tableRow = document.createElement('tr');
578        // Add patient name to table
579        var patientIdStr = patientnamePatientid[patientName];
580        var columnCell = document.createElement('td');
581        var patientLinkStr = createLinkStr(patientName, patientIdStr, 'BIOSOURCE', 'View this sample', sessionId);
582        var tableCol = createTableCellElementHtml(patientLinkStr, 'reportdata');
583        tableRow.appendChild(tableCol);
584        // Add dates to table in chronological order
585        var dateSet = patientsWithMultipleDates[patientName];
586        var dateStr1 = '';
587        var dateStr2 = '';
588        for (var key in dateSet)
589        {
590          var dateStr = dateSet[key];
591          if (dateStr1 == '')
592          {
593            dateStr1 = dateStr;
594          }
595          else if (dateStr > dateStr1)
596          {
597            dateStr2 = dateStr;
598          }
599          else
600          {
601            dateStr2 = dateStr1;
602            dateStr1 = dateStr;
603          }
604        }
605        var dateCol = '';
606        dateCol = getTableCellElement(dateStr1, 'reportdata');
607        tableRow.appendChild(dateCol);
608        dateCol = getTableCellElement(dateStr2, 'reportdata');
609        tableRow.appendChild(dateCol);
610        multipleDatesTable.appendChild(tableRow);
611      }
612    }
613
614    return multipleDatesTable;
615  }
616 
617  function addDataRowsToConsentTable(report, reportTable, numDecimals)
618  {
619    var sites = report.sites;   
620    var statistics = report.statistics;
621    unknownCreation = statistics.noDate;
622    unknownSite = statistics.unknownSite;
623    var siteOrderList = report.siteOrderListKey;
624    for (var siteOrderIndex in siteOrderList)
625    {
626      var namePrefix = siteOrderList[siteOrderIndex];   
627      if (!sites.hasOwnProperty(namePrefix)) continue;       
628      var site = sites[namePrefix];
629      var siteName = site.name;       
630      var year = site.startDate.substr(0,4);
631      var month = site.startDate.substr(5,2);
632      var date = site.startDate.substr(8,2);     
633      var siteStartDate = new Date(year, month-1, date);
634     
635      var siteData = statistics[namePrefix];     
636      var siteLatestDate = siteData['latestDateKey'];
637      var siteLatestDateYear = siteLatestDate.substr(0,4);
638      var siteLatestDateMonth = siteLatestDate.substr(4,2);
639      var siteLatestDateDate = siteLatestDate.substr(6,2);
640      var siteLatestDateStr = siteLatestDateYear + '-' + siteLatestDateMonth + '-' + siteLatestDateDate;
641      var tableRow = document.createElement('tr');
642      var tableCol = getTableCellElement(siteName, 'rowtitle');
643      tableRow.appendChild(tableCol);
644      tableRow.appendChild(getTableCellElement(year+'-'+(month)+'-'+date, 'reportdata'));
645      tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
646      //var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());     
647      var sumKey = 'sumKey';
648      if (siteData != null)
649      {
650        //data = getJSONDataWithPercent(siteData, 'yes', sumKey, numDecimals);
651        //tableRow.appendChild(getTableCellElement(data, 'reportdata'));
652        data = getJSONDataWithPercent(siteData, 'yesPatient', sumKey, numDecimals);
653        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
654        data = getJSONDataWithPercent(siteData, 'yesNoPatient', sumKey, numDecimals);
655        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
656        data = getJSONDataWithPercent(siteData, 'yesNoDate', sumKey, numDecimals);
657        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
658        data = getJSONDataWithPercent(siteData, 'no', sumKey, numDecimals);
659        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
660        data = getJSONDataWithPercent(siteData, 'noNoDate', sumKey, numDecimals);
661        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
662        data = getJSONDataWithPercent(siteData, 'notAsked', sumKey, numDecimals);
663        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
664        data = getJSONDataWithPercent(siteData, 'notAskedNoDate', sumKey, numDecimals);
665        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
666        //data = getJSONDataWithPercent(siteData, 'other', sumKey, numDecimals);
667        //tableRow.appendChild(getTableCellElement(data, 'reportdata'));
668        data = getJSONDataWithPercent(siteData, 'missing', sumKey, numDecimals);
669        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
670        // Add column with summed values for site
671        var siteSum = 0;
672        if (siteData != null)
673        {
674          if (siteData[sumKey] != null)
675          {
676            siteSum = siteData[sumKey];
677          }
678        }
679        tableRow.appendChild(getTableCellElement(siteSum, 'rowsummary'));
680      }
681/*
682      // Add column with total number of samples for site, regardless of creation date
683      var siteTotal = 0;
684      if (siteData != null)
685      {
686        var totalKey = 'totalKey';
687        if (siteData[totalKey] != null)
688        {
689          siteTotal = siteData[totalKey];
690        }
691      }
692      tableRow.appendChild(getTableCellElement(siteTotal, 'rowsummary'));
693*/
694      reportTable.appendChild(tableRow);
695    }
696  }
697
698  function createLinkStr(linkName, idStr, itemTypeStr, titleStr, sessionId)
699  {
700    var linkStr = '<span class="link" onclick="Main.itemOnClick(event, \'' + sessionId + '\', \'' + itemTypeStr + '\', ' + idStr + ', false)" title="' + titleStr + '">' + linkName + '</span>';
701    return linkStr;
702  }
703
704  function createTableCellElementHtml(html, clazz, colspan, rowspan)
705  {
706    var htmlStr = new String(html);
707    var cellElement = document.createElement('td');
708    cellElement.innerHTML = htmlStr;
709    cellElement.setAttribute('class', clazz);
710    if (colspan != null) cellElement.setAttribute('colspan', colspan);
711    if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
712   
713    return cellElement;
714  }
715 
716  function getJSONDataWithPercent(jsonObject, key, sumKey, numDecimals)
717  {
718    var dataNum = getJSONData(jsonObject, key);
719    var dataSum = getJSONData(jsonObject, sumKey);
720    var dataPct = '0';
721    if (dataSum != null || dataSum != 0)
722    {
723      dataPct = 100*dataNum/dataSum;
724      dataPct = dataPct.toFixed(numDecimals);
725    }
726    var data = dataNum + ' (' + dataPct + '%)';
727    return data;
728  }
729
730  function getJSONData(jsonObject, key)
731  {
732    var data = '';
733    if (jsonObject != null)
734    {
735      if (jsonObject[key] != null)
736      {
737        data = jsonObject[key];
738      }
739    }
740    else
741    {
742      data = 'jsonObject==null';
743    }
744    return data;
745  }
746
747  function addQuarterColumnHeaders(columnHeaderRow, startDate)
748  {
749    var currentDate = startDate;
750    for (var i=0;i<numCols;i++)
751    {
752      var quarter = Math.floor(currentDate.getMonth()/3)+1;
753      var columnText = 'Q'+quarter;
754      var quarterHeader = getTableCellElement(columnText, 'reportsubheader');
755      columnHeaderRow.appendChild(quarterHeader); 
756      currentDate.setMonth(currentDate.getMonth()+3);     
757    }
758  }
759 
760  function addWeekColumnHeaders(columnHeaderRow, startDate)
761  {
762    var currentDate = startDate;
763    var day = currentDate.getDay()-1;
764    day = day>=0 ? day: day + 7;
765    currentDate.setDate(currentDate.getDate()-day);
766    for (var i=0;i<numCols;i++)
767    {     
768      var weekNum = getISOWeekNumber(currentDate);
769      var columnText = weekNum;
770      if (weekNum < 10) columnText = '0'+columnText;     
771      columnHeaderRow.appendChild(getTableCellElement(columnText, 'reportsubheader'));
772      currentDate.setDate(currentDate.getDate()+7);     
773    }
774  }
775 
776  function addMonthColumnHeaders(columnHeaderRow, startDate)
777  {   
778    var currentDate = new Date(startDate.getFullYear(), startDate.getMonth());
779    for (var i=0;i<numCols;i++)
780    {             
781      var monthHeader = getTableCellElement(month[currentDate.getMonth()], 'reportsubheader');
782      columnHeaderRow.appendChild(monthHeader);       
783      currentDate.setMonth(currentDate.getMonth() +1);
784    }   
785  }
786 
787  function addYearSubHeaders(startDate, endDate, subHeaderRowYear, vt)
788  {   
789    var currentYear = startDate.getFullYear(); 
790   
791    var columnCounter = 0;   
792    do
793    {
794      var colspan;
795      var headerText = currentYear;
796      if (vt == "MONTH")
797      {
798        if (currentYear == startDate.getFullYear())
799        {
800          colspan =  11-startDate.getMonth()+1;
801          if (endDate.getFullYear() == currentYear)
802          {
803            colspan = colspan - (11-endDate.getMonth());
804          }
805        }
806        else if (currentYear == endDate.getFullYear()) 
807          colspan = endDate.getMonth()+1;
808        else
809          colspan = 12;
810      }
811      else if (vt == "WEEK")
812      { 
813        if (startDate.getFullYear() == endDate.getFullYear())
814        {
815          colspan = numCols;
816        }
817        else if (currentYear == startDate.getFullYear())
818        {
819          var startWeek = getISOWeekNumber(startDate);
820          var lastDay = new Date(startDate.getFullYear(), 11, 31);
821          var endWeek = getISOWeekNumber(lastDay);
822          if (endWeek == 1)
823          {
824            lastDay.setDate(lastDay.getDate()-7);
825            endWeek = getISOWeekNumber(lastDay);
826          }
827          colspan = endWeek - startWeek +1;
828        }
829        else if (currentYear == endDate.getFullYear())
830        {
831          var endWeek = getISOWeekNumber(endDate);
832          colspan = endWeek;
833        }
834        else
835        {
836          var dateInLastWeek = new Date(currentYear, 11, 31);
837          var endWeek = getISOWeekNumber(dateInLastWeek);
838          if (endWeek == 1)
839          {
840            dateInLastWeek.setDate(dateInLastWeek.getDate()-7);
841            endWeek = getISOWeekNumber(dateInLastWeek);
842          }
843          colspan = endWeek;
844        }               
845      }
846      else if (vt == "QUARTER")
847      {
848        if (currentYear == startDate.getFullYear())
849        {
850          if (startDate.getFullYear() == endDate.getFullYear())
851          {
852            colspan = Math.floor((endDate.getMonth()-startDate.getMonth())/3)+1;
853          }
854          else
855          {
856            colspan = Math.floor((11-startDate.getMonth())/3) +1;
857          }
858        }
859        else if(currentYear == endDate.getFullYear())
860        {
861          colspan = Math.floor(endDate.getMonth()/3)+1;
862        }
863        else 
864        {
865          colspan = 4;
866        }
867      }
868      else if (vt == "YEAR")
869      {
870        colspan = 1;       
871      }
872      columnCounter += colspan;           
873      subHeaderRowYear.appendChild(getTableCellElement(headerText, 'reportsubheader', colspan));
874    }while(!(++currentYear>endDate.getFullYear()));
875  }
876 
877  function addDataRowsToTable(report, reportTable)
878  {
879    var fdString = report.beginDate;
880    var ldString = report.endDate;
881    var psdString = report.periodBeginDate;
882    var startDate = new Date();
883    startDate.setYear(fdString.substr(0,4));
884    startDate.setMonth(fdString.substr(4,2)-1);
885    startDate.setDate(fdString.substr(6));
886    var endDate = new Date();
887    endDate.setYear(ldString.substr(0,4));
888    endDate.setMonth(ldString.substr(4,2)-1);
889    endDate.setDate(ldString.substr(6));
890    var periodStartDate = new Date();
891    periodStartDate.setYear(psdString.substr(0,4));
892    periodStartDate.setMonth(psdString.substr(4,2)-1);
893    periodStartDate.setDate(psdString.substr(6));
894    var viewType = report.viewType;   
895    var sites = report.sites;   
896    var statistics = report.statistics;
897    unknownCreation = statistics.noDate;
898    unknownSite = statistics.unknownSite;
899    var siteOrderList = report.siteOrderListKey;
900    for (var siteOrderIndex in siteOrderList)
901    {
902      var namePrefix = siteOrderList[siteOrderIndex];   
903      if (!sites.hasOwnProperty(namePrefix)) continue;
904      var site = sites[namePrefix];
905      var siteName = site.name;   
906      var year = site.startDate.substr(0,4);
907      var month = site.startDate.substr(5,2);
908      var date = site.startDate.substr(8,2);     
909      var siteStartDate = new Date(year, month-1, date);
910     
911      var siteData = statistics[namePrefix];
912      var siteLatestDate = siteData['latestDateKey'];
913      var siteLatestDateYear = siteLatestDate.substr(0,4);
914      var siteLatestDateMonth = siteLatestDate.substr(4,2);
915      var siteLatestDateDate = siteLatestDate.substr(6,2);
916      var siteLatestDateStr = siteLatestDateYear + '-' + siteLatestDateMonth + '-' + siteLatestDateDate;
917      var tableRow = document.createElement('tr');
918      var tableCol = getTableCellElement(siteName, 'rowtitle');
919      tableRow.appendChild(tableCol);
920      tableRow.appendChild(getTableCellElement(year+'-'+(month)+'-'+date, 'reportdata'));
921      tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
922      var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());     
923      var columnCounter = 0;
924      do
925      {
926        var data = 0;
927        var keyIndex;
928        var yearIndex = currentDate.getFullYear();
929       
930        if (viewType == 'YEAR')
931        {
932          keyIndex = yearIndex;
933          if (siteData != null)
934          {
935            if (siteData[keyIndex] != null) data = siteData[keyIndex];
936          }
937          if ( (currentDate.getFullYear() < siteStartDate.getFullYear()))
938          {
939            data = '';
940          }
941          currentDate.setFullYear(currentDate.getFullYear()+1);
942        }
943        else if (viewType == 'QUARTER')
944        {
945          var qIndex = Math.floor(currentDate.getMonth()/3) + 1;
946          var startQuarter = Math.floor(siteStartDate.getMonth()/3)+1;
947          keyIndex = yearIndex + '' + qIndex;
948          if (siteData != null)
949          {
950            if (siteData[keyIndex] != null) data = siteData[keyIndex];           
951          }         
952          if ( (currentDate.getFullYear() <= siteStartDate.getFullYear()) && qIndex<startQuarter)
953          {
954            data = '';
955          }
956          currentDate.setMonth(currentDate.getMonth()+3);         
957        }
958        else if (viewType == 'MONTH')
959        {
960          var monthIndex = currentDate.getMonth()+1;
961          var rowFill = monthIndex < 10 ? '0' : '';
962          keyIndex = yearIndex + rowFill + monthIndex;
963          if (siteData != null)
964          {
965            if (siteData[keyIndex] != null) data = siteData[keyIndex];
966          }
967          if (currentDate.getFullYear() <= siteStartDate.getFullYear() && (monthIndex-1) < siteStartDate.getMonth())
968          {
969            data = '';
970          }
971         
972         
973          currentDate.setMonth(currentDate.getMonth()+1);
974        }
975        else if (viewType == 'WEEK')
976        {
977          var weekIndex = getISOWeekNumber(currentDate);
978          keyIndex = yearIndex + '' + weekIndex;
979          if (siteData != null)
980          {
981            if (siteData[keyIndex] != null) data = siteData[keyIndex];
982          }
983          if (currentDate.getFullYear() <= siteStartDate.getFullYear() && getISOWeekNumber(currentDate) < getISOWeekNumber(siteStartDate))
984          {
985            data = '';
986          }
987          currentDate.setDate(currentDate.getDate()+7);
988        }
989       
990        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
991        columnCounter++;       
992      } while (columnCounter < numCols)
993      // Add column with sample sum for site for the selected time period
994      var siteSum = 0;
995      if (siteData != null)
996      {
997        var sumSiteKey = 'sumSiteKey';
998        if (siteData[sumSiteKey] != null)
999        {
1000          siteSum = siteData[sumSiteKey];
1001        }
1002      }
1003      tableRow.appendChild(getTableCellElement(siteSum, 'rowsummary'));
1004      // Add column with total number of samples for site, regardless of creation date
1005      var siteTotal = 0;
1006      if (siteData != null)
1007      {
1008        var totalSiteKey = 'totalSiteKey';
1009        if (siteData[totalSiteKey] != null)
1010        {
1011          siteTotal = siteData[totalSiteKey];
1012        }
1013      }
1014      tableRow.appendChild(getTableCellElement(siteTotal, 'rowsummary'));
1015      reportTable.appendChild(tableRow);
1016    }
1017  }
1018 
1019  function createSortedPeriodArray(report, numberOfColumns)
1020  {
1021    var psdString = report.periodBeginDate;
1022    var periodStartDate = new Date();
1023    periodStartDate.setYear(psdString.substr(0,4));
1024    periodStartDate.setMonth(psdString.substr(4,2)-1);
1025    periodStartDate.setDate(psdString.substr(6));
1026    var viewType = report.viewType;   
1027    var sortedPeriodArray = Array(numberOfColumns);
1028    var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());     
1029    var columnCounter = 0;
1030    do
1031    { 
1032      var keyIndex;
1033      var yearIndex = currentDate.getFullYear();
1034       
1035      if (viewType == 'YEAR')
1036      {
1037        keyIndex = yearIndex;
1038        currentDate.setFullYear(currentDate.getFullYear()+1);
1039      }
1040      else if (viewType == 'QUARTER')
1041      {
1042        var qIndex = Math.floor(currentDate.getMonth()/3) + 1;
1043        keyIndex = yearIndex + '' + qIndex;
1044        currentDate.setMonth(currentDate.getMonth()+3);         
1045      }
1046      else if (viewType == 'MONTH')
1047      {
1048        var monthIndex = currentDate.getMonth()+1;
1049        var rowFill = monthIndex < 10 ? '0' : '';
1050        keyIndex = yearIndex + rowFill + monthIndex;
1051        currentDate.setMonth(currentDate.getMonth()+1);
1052      }
1053      else if (viewType == 'WEEK')
1054      {
1055        var weekIndex = getISOWeekNumber(currentDate);
1056        keyIndex = yearIndex + '' + weekIndex;
1057        currentDate.setDate(currentDate.getDate()+7);
1058      }
1059      sortedPeriodArray[columnCounter] = keyIndex;
1060      columnCounter++;       
1061    } while (columnCounter < numberOfColumns)
1062    return sortedPeriodArray;
1063  }
1064 
1065  function getReportTable()
1066  {
1067      var reportTable = document.createElement('table');
1068      reportTable.setAttribute('class','reporttable');
1069      reportTable.setAttribute('border','1');     
1070      return reportTable;
1071  }
1072 
1073  function getTableCellElement(text, clazz, colspan, rowspan)
1074  {
1075    var cellElement = document.createElement('td');
1076    text = new String(text);   
1077    var textArray = text.split("\n");   
1078    if (textArray.length > 1)
1079    {
1080      for (var i=0;i<textArray.length;i++)
1081      {       
1082        if (i>0)cellElement.appendChild(document.createElement('br'));
1083        cellElement.appendChild(document.createTextNode(textArray[i]));
1084      }     
1085    }
1086    else
1087    {
1088      cellElement.appendChild(document.createTextNode(text));
1089    }
1090    cellElement.setAttribute('class', clazz);
1091    if (colspan != null) cellElement.setAttribute('colspan', colspan);
1092    if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
1093   
1094    return cellElement;
1095  }
1096 
1097  function getListElement(itemText)
1098  {
1099    var listElement = document.createElement('li');
1100    var textNode = document.createTextNode(itemText);
1101    listElement.appendChild(textNode);
1102    return listElement;
1103  }
1104
1105  /*
1106   * Get the ISO week number for a given date
1107   *
1108   * Based on code at http://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php
1109   */
1110  function getISOWeekNumber(date)
1111  {
1112    tmpDate = new Date(date);
1113    tmpDate.setHours(0,0,0);
1114    // Set to nearest Thursday: current date + 4 - current day number
1115    // Make Sunday day number 7
1116    tmpDate.setDate(tmpDate.getDate() + 4 - (tmpDate.getDay() || 7));
1117    // Get first day of year
1118    var yearStart = new Date(tmpDate.getFullYear(), 0, 1);
1119    // Calculate full weeks to nearast Thursday (86400000 = 24*60*60*1000 number of ms in a day)
1120    var weekNo = Math.ceil(( ( (tmpDate - yearStart) / 86400000) + 1)/7);
1121    return weekNo;
1122  }
1123
1124  </script>
1125 
1126 
1127  </base:head>
1128  <base:body onload="init()">
1129    <p:path><p:pathelement 
1130      title="Reggie" href="<%="index.jsp?ID="+ID%>" 
1131      /><p:pathelement title="Report generator" 
1132      /></p:path>
1133    <div class="content">
1134    <%
1135    if (sc.getActiveProjectId() == 0)
1136    {
1137      %>
1138      <div class="messagecontainer note" style="width: 950px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
1139        No project has been selected. You may proceed with the report generation but
1140        only your own items will be included in the report.
1141      </div>
1142      <%
1143    }
1144    %>
1145 
1146    <form name="reggie" onsubmit="return false;">
1147      <!-- 1. Report type-->
1148      <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1149      <tr>
1150        <td rowspan="3" class="stepno">1</td>
1151        <td class="steptitle">Report type</td>
1152      </tr>
1153      <tr>
1154        <td class="stepfields">
1155          <table border="0" cellspacing="0" cellpadding="0" width="100%">
1156          <tr valign="top">
1157            <td class="prompt">Report</td>
1158            <td class="input">
1159              <select name="reporttype">
1160                <option value="samplecount" selected="yes">Sample count report</option>
1161                <option value="consentcount">Consent count report</option>
1162              </select>
1163            </td>
1164            <td class="status" id="report.status"></td>
1165            <td class="help">
1166              <span id="report.message" class="message" style="display: none;"></span>
1167              Select which report to generate.
1168            </td>
1169          </tr>
1170          </table>
1171        </td>
1172      </tr>
1173      </table>
1174     
1175      <div id="sampleCountSection" style="display:none;">
1176        <p></p>
1177        <!-- 2. Report parameters-->
1178        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1179        <tr>
1180          <td rowspan="3" class="stepno">2</td>
1181          <td class="steptitle">Report parameters</td>
1182        </tr>
1183        <tr>
1184          <td class="stepfields">
1185            <table border="0" cellspacing="0" cellpadding="0" width="100%">           
1186            <tr>
1187              <td valign="top" class="prompt">Report period</td>
1188              <td valign="top" class="input">
1189                From<input type="text" onChange="dateOnChange()" size=7 name="fromdate"/>&nbsp;
1190                To<input type="text" onChange="dateOnChange()" size=7 name="todate" />
1191              </td>
1192              <td valign="top" class="status" id="displayInterval.status"></td>
1193              <td class="help">
1194                <span id="displayInterval.message" class="message" style="display: none;"></span>
1195                Define which period the report should cover. Empty fields will include all tubes.<br>
1196              </td>
1197            </tr> 
1198            <tr>         
1199              <td valign="top" class="prompt">View type</td>
1200              <td valign="top" class="input">
1201                <select name="viewtype">
1202                  <option value="AUTO" selected="yes">Auto</option>
1203                  <option value="WEEK">Week</option>
1204                  <option value="MONTH">Month</option>
1205                  <option value="QUARTER">Quarter</option>
1206                  <option value="YEAR">Year</option>
1207                </select>
1208              </td>
1209              <td valign="top" class="status" id="displayViewType.status"></td>
1210              <td class="help">
1211                <span id="displayViewType.message" class="message" style="display: none;"></span>
1212                Auto will adjust the report depending on the size of the period.
1213                <ul>
1214                  <li>Period shorter then 3 months - specimens per week</li>
1215                  <li>Period shorter then 13 months - specimens per month</li>
1216                  <li>Period shorter then 3 year - specimens per quarter</li>
1217                  <li>Period is 3 year or greater - specimens per year</li>
1218                </ul>                 
1219              </td>
1220            </tr>
1221            </table>
1222          </td>
1223        </tr>
1224        </table>
1225      </div>
1226     
1227      <div id="consentCountSection" style="display:none;">
1228        <p></p>
1229        <!-- 2. Report parameters-->
1230        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1231        <tr>
1232          <td rowspan="3" class="stepno">2</td>
1233          <td class="steptitle">Report parameters</td>
1234        </tr>
1235        <tr>
1236          <td class="stepfields">
1237            <table border="0" cellspacing="0" cellpadding="0" width="100%">           
1238            <tr>
1239              <td valign="top" class="prompt">No report parameters</td>
1240              <td valign="top" class="input">
1241              </td>
1242              <td valign="top" class="status" id="displayInterval.status"></td>
1243              <td class="help">
1244                <span id="displayInterval.message" class="message" style="display: none;"></span>
1245                Consent report will be generated irrespective of date for consent.<br>
1246              </td>
1247            </tr> 
1248            </table>
1249          </td>
1250        </tr>
1251        </table>
1252      </div>
1253     
1254      <div id="reportSection" style="display:none;">
1255        <p></p>
1256        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1257        <tr>
1258          <td rowspan="3" class="stepno">3</td>
1259          <td class="steptitle">Generated report</td>
1260        </tr>
1261        <tr>
1262          <td id="reportcell" class="stepfields">
1263            <i>Generating report...</i>
1264          </td>
1265        </tr>
1266        </table>
1267      </div> 
1268     
1269      <div class="messagecontainer error" id="errorMessage" style="display: none; width: 950px; margin-left: 20px; margin-bottom: 0px;"></div>   
1270       
1271      <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
1272        <tr>
1273          <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
1274          <td><base:button id="gonext" title="Next" image="<%=home+"/images/gonext.png"%>" onclick="goNext(true)" /></td>
1275          <td><base:button id="gocreate" title="Generate" image="<%=home+"/images/gonext.png"%>" onclick="goCreate()" style="display: none;"/></td>         
1276          <td><base:button id="gorestart" title="Restart" image="<%=home+"/images/goback.png"%>" onclick="goRestart(true)" style="display: none;"/></td>
1277          <td id="gonext.message" class="message"></td>
1278        </tr>
1279      </table>     
1280    </form>
1281    </div>
1282   
1283  </base:body>
1284  </base:page>
1285  <%
1286}
1287finally
1288{
1289  if (dc != null) dc.close();
1290}
1291%>
Note: See TracBrowser for help on using the repository browser.