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

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

Refs #428. Refs #420. Refs #426. Sample count report and consent count report updated to show sites in alphabetical order of site names.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 42.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+4)));
353   
354    // Sub headers
355    // Only if each datacol is less then a year
356    if (viewType != 'YEAR')
357    {
358      subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader', 2));
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    columnHeaderRow.appendChild(siteHeader);
367    columnHeaderRow.appendChild(startDateHeader); 
368   
369    if (viewType == 'MONTH') addMonthColumnHeaders(columnHeaderRow, periodStartDate);
370    else if (viewType == 'WEEK') addWeekColumnHeaders(columnHeaderRow, periodStartDate);
371    else if (viewType == 'QUARTER') addQuarterColumnHeaders(columnHeaderRow, periodStartDate);
372    else if (viewType == 'YEAR') addYearSubHeaders(periodStartDate, endDate, columnHeaderRow, viewType);
373   
374   
375    columnHeaderRow.appendChild(getTableCellElement('Sum', 'reportsubheader'));
376    columnHeaderRow.appendChild(getTableCellElement('Total', 'reportsubheader'));
377
378    // Build table     
379    reportTable.appendChild(headerRow);
380    reportTable.appendChild(subHeaderRowYear);
381    reportTable.appendChild(columnHeaderRow);
382         
383    // Data rows     
384    addDataRowsToTable(report, reportTable);
385     
386    // Add a row with the combined numbers for all sites for each period
387    var sitesCombinedRow = document.createElement('tr');
388    sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
389    sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary'));
390    // Get combined numbers for all sites for each period
391    var statistics = report.statistics;
392    var sitesCombined = statistics.sitesCombinedKey;   
393    var sortedKeyArray = createSortedPeriodArray(report, numCols);
394    var key;
395    for (arrayIndex in sortedKeyArray)
396    {
397      key = sortedKeyArray[arrayIndex];
398      var data = getJSONData(sitesCombined, key);
399      // Add entry with sample sum for site for selected time period
400      sitesCombinedRow.appendChild(getTableCellElement(data,'colsummary'));
401    }
402    // Get total number of samples for site for the selected time period
403    var sum = statistics.sumKey;
404    // Add entry with total number of samples for site for the selected time period
405    sitesCombinedRow.appendChild(getTableCellElement(sum, 'colsummary'));
406    // Get total number of samples for all sites, regardless of creation date
407    var total = statistics.totalKey;
408    // Add entry with total number of samples for all sites, regardless of creation date
409    sitesCombinedRow.appendChild(getTableCellElement(total, 'colsummary'));
410    reportTable.appendChild(sitesCombinedRow); 
411
412    return reportTable;
413  }
414 
415  function createConsentCountReport(report)
416  {
417    var reportTable = getReportTable();
418/*
419    var sdString = report.beginDate;
420    var edString = report.endDate;
421    var psdString = report.periodBeginDate;
422    var ldString = report.latestDate;
423    var startDate = new Date();
424    startDate.setYear(sdString.substr(0,4));
425    startDate.setMonth(sdString.substr(4,2)-1);
426    startDate.setDate(sdString.substr(6));
427    var endDate = new Date();
428    endDate.setYear(edString.substr(0,4));
429    endDate.setMonth(edString.substr(4,2)-1);
430    endDate.setDate(edString.substr(6));
431    var periodStartDate = new Date();
432    periodStartDate.setYear(psdString.substr(0,4));
433    periodStartDate.setMonth(psdString.substr(4,2)-1);
434    periodStartDate.setDate(psdString.substr(6));
435    var latestDate;
436    if (ldString != null)
437    {
438      latestDate = new Date();
439      latestDate.setYear(ldString.substr(0,4));
440      latestDate.setMonth(ldString.substr(4,2)-1);
441      latestDate.setDate(ldString.substr(6));
442    }   
443   
444    var viewType = report.viewType; 
445*/ 
446 
447    var headerRow = document.createElement('tr');   
448    var subHeaderRow = document.createElement('tr');
449    var columnHeaderRow = document.createElement('tr');
450   
451    var numCols = 8;
452    var numDecimals = 0;
453    var headerText = '# Consent forms of different types for cases and blood samples';
454    headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+3)));
455   
456    // Subheader   
457    subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
458    subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
459   
460    //subHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
461    subHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
462    subHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
463    subHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
464    subHeaderRow.appendChild(getTableCellElement('No', 'reportsubheader'));
465    subHeaderRow.appendChild(getTableCellElement('No', 'reportsubheader'));
466    subHeaderRow.appendChild(getTableCellElement('Not asked', 'reportsubheader'));
467    subHeaderRow.appendChild(getTableCellElement('Not asked', 'reportsubheader'));
468    //subHeaderRow.appendChild(getTableCellElement('Other', 'reportsubheader'));
469    subHeaderRow.appendChild(getTableCellElement('Missing', 'reportsubheader'));
470    subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
471    //subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
472
473    // Columnsheader   
474    var siteHeader = getTableCellElement('Site', 'reportsubheader');     
475    var startDateHeader = getTableCellElement('Start date','reportsubheader');
476    columnHeaderRow.appendChild(siteHeader);
477    columnHeaderRow.appendChild(startDateHeader); 
478   
479    //columnHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
480    columnHeaderRow.appendChild(getTableCellElement('date, PAT#', 'reportsubheader'));
481    columnHeaderRow.appendChild(getTableCellElement('date, no PAT#', 'reportsubheader'));
482    columnHeaderRow.appendChild(getTableCellElement('no date', 'reportsubheader'));
483    columnHeaderRow.appendChild(getTableCellElement('date', 'reportsubheader'));
484    columnHeaderRow.appendChild(getTableCellElement('no date', 'reportsubheader'));
485    columnHeaderRow.appendChild(getTableCellElement('date', 'reportsubheader'));
486    columnHeaderRow.appendChild(getTableCellElement('no date', 'reportsubheader'));
487    //columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
488    columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
489    columnHeaderRow.appendChild(getTableCellElement('Sum', 'reportsubheader'));
490    //columnHeaderRow.appendChild(getTableCellElement('Total', 'reportsubheader'));
491
492    // Build table     
493    reportTable.appendChild(headerRow);
494    reportTable.appendChild(subHeaderRow);
495    reportTable.appendChild(columnHeaderRow);
496         
497    // Data rows     
498    addDataRowsToConsentTable(report, reportTable);
499     
500    // Add a row with the combined numbers for all sites for each period
501    var sitesCombinedRow = document.createElement('tr');
502    sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
503    sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary'));
504    // Get combined numbers for all sites for each period
505    var sumKey = 'sumKey';
506    var statistics = report.statistics;
507    var sitesCombined = statistics.sitesCombinedKey;
508    if (sitesCombined != null)
509    {
510      //data = getJSONDataRightPadded(sitesCombined, 'yes', sumKey, numDecimals);
511      //sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
512      data = getJSONDataWithPercent(sitesCombined, 'yesPatient', sumKey, numDecimals);
513      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
514      data = getJSONDataWithPercent(sitesCombined, 'yesNoPatient', sumKey, numDecimals);
515      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
516      data = getJSONDataWithPercent(sitesCombined, 'yesNoDate', sumKey, numDecimals);
517      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
518      data = getJSONDataWithPercent(sitesCombined, 'no', sumKey, numDecimals);
519      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
520      data = getJSONDataWithPercent(sitesCombined, 'noNoDate', sumKey, numDecimals);
521      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
522      data = getJSONDataWithPercent(sitesCombined, 'notAsked', sumKey, numDecimals);
523      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
524      data = getJSONDataWithPercent(sitesCombined, 'notAskedNoDate', sumKey, numDecimals);
525      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
526      //data = getJSONDataWithPercent(sitesCombined, 'other', sumKey, numDecimals);
527      //sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
528      data = getJSONDataWithPercent(sitesCombined, 'missing', sumKey, numDecimals);
529      sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
530    }
531    // Add entry with total number of consents with chosen restrictions
532    data = getJSONData(sitesCombined, sumKey);
533    sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
534/*
535    // Add entry with total number of consents, regardless of restrictions
536    data = getJSONData(sitesCombined, totalKey);
537    sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
538*/
539    reportTable.appendChild(sitesCombinedRow); 
540
541    return reportTable;
542  }
543 
544  function createConsentTablePatientsWithMultipleDates(report)
545  {
546    var multipleDatesTable = getReportTable();
547    var headerRow = document.createElement('tr');   
548    var columnHeaderRow = document.createElement('tr');
549   
550    // Table header
551    var numCols = 3;
552    var headerText = 'Consent forms with multiple dates for same patient';
553    headerRow.appendChild(getTableCellElement(headerText, 'reportheader', numCols));
554   
555    // Columnsheader
556    columnHeaderRow.appendChild(getTableCellElement('Patient ID', 'reportsubheader'));
557    columnHeaderRow.appendChild(getTableCellElement('Date 1', 'reportsubheader'));
558    columnHeaderRow.appendChild(getTableCellElement('Date 2', 'reportsubheader'));
559
560    // Build table     
561    multipleDatesTable.appendChild(headerRow);
562    multipleDatesTable.appendChild(columnHeaderRow);
563         
564    // Data rows
565    if (report != null)
566    {
567      var statistics = report.statistics;
568      var sessionId = statistics.sessionIdKey;
569      var patientsWithMultipleDates = statistics.patientsWithMultipleDatesKey;
570      var patientnamePatientid = statistics.patientnamePatientidKey;
571      for (var patientName in patientsWithMultipleDates)
572      {
573        var tableRow = document.createElement('tr');
574        // Add patient name to table
575        var patientIdStr = patientnamePatientid[patientName];
576        var columnCell = document.createElement('td');
577        var patientLinkStr = createLinkStr(patientName, patientIdStr, 'BIOSOURCE', 'View this sample', sessionId);
578        var tableCol = createTableCellElementHtml(patientLinkStr, 'reportdata');
579        tableRow.appendChild(tableCol);
580        // Add dates to table in chronological order
581        var dateSet = patientsWithMultipleDates[patientName];
582        var dateStr1 = '';
583        var dateStr2 = '';
584        for (var key in dateSet)
585        {
586          var dateStr = dateSet[key];
587          if (dateStr1 == '')
588          {
589            dateStr1 = dateStr;
590          }
591          else if (dateStr > dateStr1)
592          {
593            dateStr2 = dateStr;
594          }
595          else
596          {
597            dateStr2 = dateStr1;
598            dateStr1 = dateStr;
599          }
600        }
601        var dateCol = '';
602        dateCol = getTableCellElement(dateStr1, 'reportdata');
603        tableRow.appendChild(dateCol);
604        dateCol = getTableCellElement(dateStr2, 'reportdata');
605        tableRow.appendChild(dateCol);
606        multipleDatesTable.appendChild(tableRow);
607      }
608    }
609
610    return multipleDatesTable;
611  }
612 
613  function addDataRowsToConsentTable(report, reportTable, numDecimals)
614  {
615    var sites = report.sites;   
616    var statistics = report.statistics;
617    unknownCreation = statistics.noDate;
618    unknownSite = statistics.unknownSite;
619    var siteOrderList = report.siteOrderListKey;
620    for (var siteOrderIndex in siteOrderList)
621    {
622      var namePrefix = siteOrderList[siteOrderIndex];   
623      if (!sites.hasOwnProperty(namePrefix)) continue;       
624      var site = sites[namePrefix];
625      var siteName = site.name;       
626      var year = site.startDate.substr(0,4);
627      var month = site.startDate.substr(5,2);
628      var date = site.startDate.substr(8,2);     
629      var siteStartDate = new Date(year, month-1, date);
630     
631      var siteData = statistics[namePrefix];     
632      var tableRow = document.createElement('tr');
633      var tableCol = getTableCellElement(siteName, 'rowtitle');
634      tableRow.appendChild(tableCol);
635      tableRow.appendChild(getTableCellElement(year+'-'+(month)+'-'+date, 'reportdata'));
636      //var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());     
637      var sumKey = 'sumKey';
638      if (siteData != null)
639      {
640        //data = getJSONDataWithPercent(siteData, 'yes', sumKey, numDecimals);
641        //tableRow.appendChild(getTableCellElement(data, 'reportdata'));
642        data = getJSONDataWithPercent(siteData, 'yesPatient', sumKey, numDecimals);
643        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
644        data = getJSONDataWithPercent(siteData, 'yesNoPatient', sumKey, numDecimals);
645        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
646        data = getJSONDataWithPercent(siteData, 'yesNoDate', sumKey, numDecimals);
647        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
648        data = getJSONDataWithPercent(siteData, 'no', sumKey, numDecimals);
649        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
650        data = getJSONDataWithPercent(siteData, 'noNoDate', sumKey, numDecimals);
651        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
652        data = getJSONDataWithPercent(siteData, 'notAsked', sumKey, numDecimals);
653        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
654        data = getJSONDataWithPercent(siteData, 'notAskedNoDate', sumKey, numDecimals);
655        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
656        //data = getJSONDataWithPercent(siteData, 'other', sumKey, numDecimals);
657        //tableRow.appendChild(getTableCellElement(data, 'reportdata'));
658        data = getJSONDataWithPercent(siteData, 'missing', sumKey, numDecimals);
659        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
660        // Add column with summed values for site
661        var siteSum = 0;
662        if (siteData != null)
663        {
664          if (siteData[sumKey] != null)
665          {
666            siteSum = siteData[sumKey];
667          }
668        }
669        tableRow.appendChild(getTableCellElement(siteSum, 'rowsummary'));
670      }
671/*
672      // Add column with total number of samples for site, regardless of creation date
673      var siteTotal = 0;
674      if (siteData != null)
675      {
676        var totalKey = 'totalKey';
677        if (siteData[totalKey] != null)
678        {
679          siteTotal = siteData[totalKey];
680        }
681      }
682      tableRow.appendChild(getTableCellElement(siteTotal, 'rowsummary'));
683*/
684      reportTable.appendChild(tableRow);
685    }
686  }
687
688  function createLinkStr(linkName, idStr, itemTypeStr, titleStr, sessionId)
689  {
690    var linkStr = '<span class="link" onclick="Main.itemOnClick(event, \'' + sessionId + '\', \'' + itemTypeStr + '\', ' + idStr + ', false)" title="' + titleStr + '">' + linkName + '</span>';
691    return linkStr;
692  }
693
694  function createTableCellElementHtml(html, clazz, colspan, rowspan)
695  {
696    var htmlStr = new String(html);
697    var cellElement = document.createElement('td');
698    cellElement.innerHTML = htmlStr;
699    cellElement.setAttribute('class', clazz);
700    if (colspan != null) cellElement.setAttribute('colspan', colspan);
701    if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
702   
703    return cellElement;
704  }
705 
706  function getJSONDataWithPercent(jsonObject, key, sumKey, numDecimals)
707  {
708    var dataNum = getJSONData(jsonObject, key);
709    var dataSum = getJSONData(jsonObject, sumKey);
710    var dataPct = '0';
711    if (dataSum != null || dataSum != 0)
712    {
713      dataPct = 100*dataNum/dataSum;
714      dataPct = dataPct.toFixed(numDecimals);
715    }
716    var data = dataNum + ' (' + dataPct + '%)';
717    return data;
718  }
719
720  function getJSONData(jsonObject, key)
721  {
722    var data = '';
723    if (jsonObject != null)
724    {
725      if (jsonObject[key] != null)
726      {
727        data = jsonObject[key];
728      }
729    }
730    else
731    {
732      data = 'jsonObject==null';
733    }
734    return data;
735  }
736
737  function addQuarterColumnHeaders(columnHeaderRow, startDate)
738  {
739    var currentDate = startDate;
740    for (var i=0;i<numCols;i++)
741    {
742      var quarter = Math.floor(currentDate.getMonth()/3)+1;
743      var columnText = 'Q'+quarter;
744      var quarterHeader = getTableCellElement(columnText, 'reportsubheader');
745      columnHeaderRow.appendChild(quarterHeader); 
746      currentDate.setMonth(currentDate.getMonth()+3);     
747    }
748  }
749 
750  function addWeekColumnHeaders(columnHeaderRow, startDate)
751  {
752    var currentDate = startDate;
753    var day = currentDate.getDay()-1;
754    day = day>=0 ? day: day + 7;
755    currentDate.setDate(currentDate.getDate()-day);
756    for (var i=0;i<numCols;i++)
757    {     
758      var weekNum = getISOWeekNumber(currentDate);
759      var columnText = weekNum;
760      if (weekNum < 10) columnText = '0'+columnText;     
761      columnHeaderRow.appendChild(getTableCellElement(columnText, 'reportsubheader'));
762      currentDate.setDate(currentDate.getDate()+7);     
763    }
764  }
765 
766  function addMonthColumnHeaders(columnHeaderRow, startDate)
767  {   
768    var currentDate = new Date(startDate.getFullYear(), startDate.getMonth());
769    for (var i=0;i<numCols;i++)
770    {             
771      var monthHeader = getTableCellElement(month[currentDate.getMonth()], 'reportsubheader');
772      columnHeaderRow.appendChild(monthHeader);       
773      currentDate.setMonth(currentDate.getMonth() +1);
774    }   
775  }
776 
777  function addYearSubHeaders(startDate, endDate, subHeaderRowYear, vt)
778  {   
779    var currentYear = startDate.getFullYear(); 
780   
781    var columnCounter = 0;   
782    do
783    {
784      var colspan;
785      var headerText = currentYear;
786      if (vt == "MONTH")
787      {
788        if (currentYear == startDate.getFullYear())
789        {
790          colspan =  11-startDate.getMonth()+1;
791          if (endDate.getFullYear() == currentYear)
792          {
793            colspan = colspan - (11-endDate.getMonth());
794          }
795        }
796        else if (currentYear == endDate.getFullYear()) 
797          colspan = endDate.getMonth()+1;
798        else
799          colspan = 12;
800      }
801      else if (vt == "WEEK")
802      { 
803        if (startDate.getFullYear() == endDate.getFullYear())
804        {
805          colspan = numCols;
806        }
807        else if (currentYear == startDate.getFullYear())
808        {
809          var startWeek = getISOWeekNumber(startDate);
810          var lastDay = new Date(startDate.getFullYear(), 11, 31);
811          var endWeek = getISOWeekNumber(lastDay);
812          if (endWeek == 1)
813          {
814            lastDay.setDate(lastDay.getDate()-7);
815            endWeek = getISOWeekNumber(lastDay);
816          }
817          colspan = endWeek - startWeek +1;
818        }
819        else if (currentYear == endDate.getFullYear())
820        {
821          var endWeek = getISOWeekNumber(endDate);
822          colspan = endWeek;
823        }
824        else
825        {
826          var dateInLastWeek = new Date(currentYear, 11, 31);
827          var endWeek = getISOWeekNumber(dateInLastWeek);
828          if (endWeek == 1)
829          {
830            dateInLastWeek.setDate(dateInLastWeek.getDate()-7);
831            endWeek = getISOWeekNumber(dateInLastWeek);
832          }
833          colspan = endWeek;
834        }               
835      }
836      else if (vt == "QUARTER")
837      {
838        if (currentYear == startDate.getFullYear())
839        {
840          if (startDate.getFullYear() == endDate.getFullYear())
841          {
842            colspan = Math.floor((endDate.getMonth()-startDate.getMonth())/3)+1;
843          }
844          else
845          {
846            colspan = Math.floor((11-startDate.getMonth())/3) +1;
847          }
848        }
849        else if(currentYear == endDate.getFullYear())
850        {
851          colspan = Math.floor(endDate.getMonth()/3)+1;
852        }
853        else 
854        {
855          colspan = 4;
856        }
857      }
858      else if (vt == "YEAR")
859      {
860        colspan = 1;       
861      }
862      columnCounter += colspan;           
863      subHeaderRowYear.appendChild(getTableCellElement(headerText, 'reportsubheader', colspan));
864    }while(!(++currentYear>endDate.getFullYear()));
865  }
866 
867  function addDataRowsToTable(report, reportTable)
868  {
869    var fdString = report.beginDate;
870    var ldString = report.endDate;
871    var psdString = report.periodBeginDate;
872    var startDate = new Date();
873    startDate.setYear(fdString.substr(0,4));
874    startDate.setMonth(fdString.substr(4,2)-1);
875    startDate.setDate(fdString.substr(6));
876    var endDate = new Date();
877    endDate.setYear(ldString.substr(0,4));
878    endDate.setMonth(ldString.substr(4,2)-1);
879    endDate.setDate(ldString.substr(6));
880    var periodStartDate = new Date();
881    periodStartDate.setYear(psdString.substr(0,4));
882    periodStartDate.setMonth(psdString.substr(4,2)-1);
883    periodStartDate.setDate(psdString.substr(6));
884    var viewType = report.viewType;   
885    var sites = report.sites;   
886    var statistics = report.statistics;
887    unknownCreation = statistics.noDate;
888    unknownSite = statistics.unknownSite;
889    var siteOrderList = report.siteOrderListKey;
890    for (var siteOrderIndex in siteOrderList)
891    {
892      var namePrefix = siteOrderList[siteOrderIndex];   
893      if (!sites.hasOwnProperty(namePrefix)) continue;
894      var site = sites[namePrefix];
895      var siteName = site.name;   
896      var year = site.startDate.substr(0,4);
897      var month = site.startDate.substr(5,2);
898      var date = site.startDate.substr(8,2);     
899      var siteStartDate = new Date(year, month-1, date);
900     
901      var siteData = statistics[namePrefix];     
902      var tableRow = document.createElement('tr');
903      var tableCol = getTableCellElement(siteName, 'rowtitle');
904      tableRow.appendChild(tableCol);
905      tableRow.appendChild(getTableCellElement(year+'-'+(month)+'-'+date, 'reportdata'));
906      var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());     
907      var columnCounter = 0;
908      do
909      {
910        var data = 0;
911        var keyIndex;
912        var yearIndex = currentDate.getFullYear();
913       
914        if (viewType == 'YEAR')
915        {
916          keyIndex = yearIndex;
917          if (siteData != null)
918          {
919            if (siteData[keyIndex] != null) data = siteData[keyIndex];
920          }
921          if ( (currentDate.getFullYear() < siteStartDate.getFullYear()))
922          {
923            data = '';
924          }
925          currentDate.setFullYear(currentDate.getFullYear()+1);
926        }
927        else if (viewType == 'QUARTER')
928        {
929          var qIndex = Math.floor(currentDate.getMonth()/3) + 1;
930          var startQuarter = Math.floor(siteStartDate.getMonth()/3)+1;
931          keyIndex = yearIndex + '' + qIndex;
932          if (siteData != null)
933          {
934            if (siteData[keyIndex] != null) data = siteData[keyIndex];           
935          }         
936          if ( (currentDate.getFullYear() <= siteStartDate.getFullYear()) && qIndex<startQuarter)
937          {
938            data = '';
939          }
940          currentDate.setMonth(currentDate.getMonth()+3);         
941        }
942        else if (viewType == 'MONTH')
943        {
944          var monthIndex = currentDate.getMonth()+1;
945          var rowFill = monthIndex < 10 ? '0' : '';
946          keyIndex = yearIndex + rowFill + monthIndex;
947          if (siteData != null)
948          {
949            if (siteData[keyIndex] != null) data = siteData[keyIndex];
950          }
951          if (currentDate.getFullYear() <= siteStartDate.getFullYear() && (monthIndex-1) < siteStartDate.getMonth())
952          {
953            data = '';
954          }
955         
956         
957          currentDate.setMonth(currentDate.getMonth()+1);
958        }
959        else if (viewType == 'WEEK')
960        {
961          var weekIndex = getISOWeekNumber(currentDate);
962          keyIndex = yearIndex + '' + weekIndex;
963          if (siteData != null)
964          {
965            if (siteData[keyIndex] != null) data = siteData[keyIndex];
966          }
967          if (currentDate.getFullYear() <= siteStartDate.getFullYear() && getISOWeekNumber(currentDate) < getISOWeekNumber(siteStartDate))
968          {
969            data = '';
970          }
971          currentDate.setDate(currentDate.getDate()+7);
972        }
973       
974        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
975        columnCounter++;       
976      } while (columnCounter < numCols)
977      // Add column with sample sum for site for the selected time period
978      var siteSum = 0;
979      if (siteData != null)
980      {
981        var sumSiteKey = 'sumSiteKey';
982        if (siteData[sumSiteKey] != null)
983        {
984          siteSum = siteData[sumSiteKey];
985        }
986      }
987      tableRow.appendChild(getTableCellElement(siteSum, 'rowsummary'));
988      // Add column with total number of samples for site, regardless of creation date
989      var siteTotal = 0;
990      if (siteData != null)
991      {
992        var totalSiteKey = 'totalSiteKey';
993        if (siteData[totalSiteKey] != null)
994        {
995          siteTotal = siteData[totalSiteKey];
996        }
997      }
998      tableRow.appendChild(getTableCellElement(siteTotal, 'rowsummary'));
999      reportTable.appendChild(tableRow);
1000    }
1001  }
1002 
1003  function createSortedPeriodArray(report, numberOfColumns)
1004  {
1005    var psdString = report.periodBeginDate;
1006    var periodStartDate = new Date();
1007    periodStartDate.setYear(psdString.substr(0,4));
1008    periodStartDate.setMonth(psdString.substr(4,2)-1);
1009    periodStartDate.setDate(psdString.substr(6));
1010    var viewType = report.viewType;   
1011    var sortedPeriodArray = Array(numberOfColumns);
1012    var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());     
1013    var columnCounter = 0;
1014    do
1015    { 
1016      var keyIndex;
1017      var yearIndex = currentDate.getFullYear();
1018       
1019      if (viewType == 'YEAR')
1020      {
1021        keyIndex = yearIndex;
1022        currentDate.setFullYear(currentDate.getFullYear()+1);
1023      }
1024      else if (viewType == 'QUARTER')
1025      {
1026        var qIndex = Math.floor(currentDate.getMonth()/3) + 1;
1027        keyIndex = yearIndex + '' + qIndex;
1028        currentDate.setMonth(currentDate.getMonth()+3);         
1029      }
1030      else if (viewType == 'MONTH')
1031      {
1032        var monthIndex = currentDate.getMonth()+1;
1033        var rowFill = monthIndex < 10 ? '0' : '';
1034        keyIndex = yearIndex + rowFill + monthIndex;
1035        currentDate.setMonth(currentDate.getMonth()+1);
1036      }
1037      else if (viewType == 'WEEK')
1038      {
1039        var weekIndex = getISOWeekNumber(currentDate);
1040        keyIndex = yearIndex + '' + weekIndex;
1041        currentDate.setDate(currentDate.getDate()+7);
1042      }
1043      sortedPeriodArray[columnCounter] = keyIndex;
1044      columnCounter++;       
1045    } while (columnCounter < numberOfColumns)
1046    return sortedPeriodArray;
1047  }
1048 
1049  function getReportTable()
1050  {
1051      var reportTable = document.createElement('table');
1052      reportTable.setAttribute('class','reporttable');
1053      reportTable.setAttribute('border','1');     
1054      return reportTable;
1055  }
1056 
1057  function getTableCellElement(text, clazz, colspan, rowspan)
1058  {
1059    var cellElement = document.createElement('td');
1060    text = new String(text);   
1061    var textArray = text.split("\n");   
1062    if (textArray.length > 1)
1063    {
1064      for (var i=0;i<textArray.length;i++)
1065      {       
1066        if (i>0)cellElement.appendChild(document.createElement('br'));
1067        cellElement.appendChild(document.createTextNode(textArray[i]));
1068      }     
1069    }
1070    else
1071    {
1072      cellElement.appendChild(document.createTextNode(text));
1073    }
1074    cellElement.setAttribute('class', clazz);
1075    if (colspan != null) cellElement.setAttribute('colspan', colspan);
1076    if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
1077   
1078    return cellElement;
1079  }
1080 
1081  function getListElement(itemText)
1082  {
1083    var listElement = document.createElement('li');
1084    var textNode = document.createTextNode(itemText);
1085    listElement.appendChild(textNode);
1086    return listElement;
1087  }
1088
1089  /*
1090   * Get the ISO week number for a given date
1091   *
1092   * Based on code at http://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php
1093   */
1094  function getISOWeekNumber(date)
1095  {
1096    tmpDate = new Date(date);
1097    tmpDate.setHours(0,0,0);
1098    // Set to nearest Thursday: current date + 4 - current day number
1099    // Make Sunday day number 7
1100    tmpDate.setDate(tmpDate.getDate() + 4 - (tmpDate.getDay() || 7));
1101    // Get first day of year
1102    var yearStart = new Date(tmpDate.getFullYear(), 0, 1);
1103    // Calculate full weeks to nearast Thursday (86400000 = 24*60*60*1000 number of ms in a day)
1104    var weekNo = Math.ceil(( ( (tmpDate - yearStart) / 86400000) + 1)/7);
1105    return weekNo;
1106  }
1107
1108  </script>
1109 
1110 
1111  </base:head>
1112  <base:body onload="init()">
1113    <p:path><p:pathelement 
1114      title="Reggie" href="<%="index.jsp?ID="+ID%>" 
1115      /><p:pathelement title="Report generator" 
1116      /></p:path>
1117    <div class="content">
1118    <%
1119    if (sc.getActiveProjectId() == 0)
1120    {
1121      %>
1122      <div class="messagecontainer note" style="width: 950px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
1123        No project has been selected. You may proceed with the report generation but
1124        only your own items will be included in the report.
1125      </div>
1126      <%
1127    }
1128    %>
1129 
1130    <form name="reggie" onsubmit="return false;">
1131      <!-- 1. Report type-->
1132      <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1133      <tr>
1134        <td rowspan="3" class="stepno">1</td>
1135        <td class="steptitle">Report type</td>
1136      </tr>
1137      <tr>
1138        <td class="stepfields">
1139          <table border="0" cellspacing="0" cellpadding="0" width="100%">
1140          <tr valign="top">
1141            <td class="prompt">Report</td>
1142            <td class="input">
1143              <select name="reporttype">
1144                <option value="samplecount" selected="yes">Sample count report</option>
1145                <option value="consentcount">Consent count report</option>
1146              </select>
1147            </td>
1148            <td class="status" id="report.status"></td>
1149            <td class="help">
1150              <span id="report.message" class="message" style="display: none;"></span>
1151              Select which report to generate.
1152            </td>
1153          </tr>
1154          </table>
1155        </td>
1156      </tr>
1157      </table>
1158     
1159      <div id="sampleCountSection" style="display:none;">
1160        <p></p>
1161        <!-- 2. Report parameters-->
1162        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1163        <tr>
1164          <td rowspan="3" class="stepno">2</td>
1165          <td class="steptitle">Report parameters</td>
1166        </tr>
1167        <tr>
1168          <td class="stepfields">
1169            <table border="0" cellspacing="0" cellpadding="0" width="100%">           
1170            <tr>
1171              <td valign="top" class="prompt">Report period</td>
1172              <td valign="top" class="input">
1173                From<input type="text" onChange="dateOnChange()" size=7 name="fromdate"/>&nbsp;
1174                To<input type="text" onChange="dateOnChange()" size=7 name="todate" />
1175              </td>
1176              <td valign="top" class="status" id="displayInterval.status"></td>
1177              <td class="help">
1178                <span id="displayInterval.message" class="message" style="display: none;"></span>
1179                Define which period the report should cover. Empty fields will include all tubes.<br>
1180              </td>
1181            </tr> 
1182            <tr>         
1183              <td valign="top" class="prompt">View type</td>
1184              <td valign="top" class="input">
1185                <select name="viewtype">
1186                  <option value="AUTO" selected="yes">Auto</option>
1187                  <option value="WEEK">Week</option>
1188                  <option value="MONTH">Month</option>
1189                  <option value="QUARTER">Quarter</option>
1190                  <option value="YEAR">Year</option>
1191                </select>
1192              </td>
1193              <td valign="top" class="status" id="displayViewType.status"></td>
1194              <td class="help">
1195                <span id="displayViewType.message" class="message" style="display: none;"></span>
1196                Auto will adjust the report depending on the size of the period.
1197                <ul>
1198                  <li>Period shorter then 3 months - specimens per week</li>
1199                  <li>Period shorter then 13 months - specimens per month</li>
1200                  <li>Period shorter then 3 year - specimens per quarter</li>
1201                  <li>Period is 3 year or greater - specimens per year</li>
1202                </ul>                 
1203              </td>
1204            </tr>
1205            </table>
1206          </td>
1207        </tr>
1208        </table>
1209      </div>
1210     
1211      <div id="consentCountSection" style="display:none;">
1212        <p></p>
1213        <!-- 2. Report parameters-->
1214        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1215        <tr>
1216          <td rowspan="3" class="stepno">2</td>
1217          <td class="steptitle">Report parameters</td>
1218        </tr>
1219        <tr>
1220          <td class="stepfields">
1221            <table border="0" cellspacing="0" cellpadding="0" width="100%">           
1222            <tr>
1223              <td valign="top" class="prompt">No report parameters</td>
1224              <td valign="top" class="input">
1225              </td>
1226              <td valign="top" class="status" id="displayInterval.status"></td>
1227              <td class="help">
1228                <span id="displayInterval.message" class="message" style="display: none;"></span>
1229                Consent report will be generated irrespective of date for consent.<br>
1230              </td>
1231            </tr> 
1232            </table>
1233          </td>
1234        </tr>
1235        </table>
1236      </div>
1237     
1238      <div id="reportSection" style="display:none;">
1239        <p></p>
1240        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1241        <tr>
1242          <td rowspan="3" class="stepno">3</td>
1243          <td class="steptitle">Generated report</td>
1244        </tr>
1245        <tr>
1246          <td id="reportcell" class="stepfields">
1247            <i>Generating report...</i>
1248          </td>
1249        </tr>
1250        </table>
1251      </div> 
1252     
1253      <div class="messagecontainer error" id="errorMessage" style="display: none; width: 950px; margin-left: 20px; margin-bottom: 0px;"></div>   
1254       
1255      <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
1256        <tr>
1257          <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
1258          <td><base:button id="gonext" title="Next" image="<%=home+"/images/gonext.png"%>" onclick="goNext(true)" /></td>
1259          <td><base:button id="gocreate" title="Generate" image="<%=home+"/images/gonext.png"%>" onclick="goCreate()" style="display: none;"/></td>         
1260          <td><base:button id="gorestart" title="Restart" image="<%=home+"/images/goback.png"%>" onclick="goRestart(true)" style="display: none;"/></td>
1261          <td id="gonext.message" class="message"></td>
1262        </tr>
1263      </table>     
1264    </form>
1265    </div>
1266   
1267  </base:body>
1268  </base:page>
1269  <%
1270}
1271finally
1272{
1273  if (dc != null) dc.close();
1274}
1275%>
Note: See TracBrowser for help on using the repository browser.