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

Last change on this file since 1732 was 1732, checked in by olle, 11 years ago

Fixes #426. First version of the consent count report generator added.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 41.8 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    for (namePrefix in sites)
620    {
621      if (!sites.hasOwnProperty(namePrefix)) continue;       
622      var site = sites[namePrefix];
623      var siteName = site.name;       
624      var year = site.startDate.substr(0,4);
625      var month = site.startDate.substr(5,2);
626      var date = site.startDate.substr(8,2);     
627      var siteStartDate = new Date(year, month-1, date);
628     
629      var siteData = statistics[namePrefix];     
630      var tableRow = document.createElement('tr');
631      var tableCol = getTableCellElement(siteName, 'rowtitle');
632      tableRow.appendChild(tableCol);
633      tableRow.appendChild(getTableCellElement(year+'-'+(month)+'-'+date, 'reportdata'));
634      //var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());     
635      var sumKey = 'sumKey';
636      if (siteData != null)
637      {
638        //data = getJSONDataWithPercent(siteData, 'yes', sumKey, numDecimals);
639        //tableRow.appendChild(getTableCellElement(data, 'reportdata'));
640        data = getJSONDataWithPercent(siteData, 'yesPatient', sumKey, numDecimals);
641        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
642        data = getJSONDataWithPercent(siteData, 'yesNoPatient', sumKey, numDecimals);
643        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
644        data = getJSONDataWithPercent(siteData, 'yesNoDate', sumKey, numDecimals);
645        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
646        data = getJSONDataWithPercent(siteData, 'no', sumKey, numDecimals);
647        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
648        data = getJSONDataWithPercent(siteData, 'noNoDate', sumKey, numDecimals);
649        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
650        data = getJSONDataWithPercent(siteData, 'notAsked', sumKey, numDecimals);
651        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
652        data = getJSONDataWithPercent(siteData, 'notAskedNoDate', sumKey, numDecimals);
653        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
654        //data = getJSONDataWithPercent(siteData, 'other', sumKey, numDecimals);
655        //tableRow.appendChild(getTableCellElement(data, 'reportdata'));
656        data = getJSONDataWithPercent(siteData, 'missing', sumKey, numDecimals);
657        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
658        // Add column with summed values for site
659        var siteSum = 0;
660        if (siteData != null)
661        {
662          if (siteData[sumKey] != null)
663          {
664            siteSum = siteData[sumKey];
665          }
666        }
667        tableRow.appendChild(getTableCellElement(siteSum, 'rowsummary'));
668      }
669/*
670      // Add column with total number of samples for site, regardless of creation date
671      var siteTotal = 0;
672      if (siteData != null)
673      {
674        var totalKey = 'totalKey';
675        if (siteData[totalKey] != null)
676        {
677          siteTotal = siteData[totalKey];
678        }
679      }
680      tableRow.appendChild(getTableCellElement(siteTotal, 'rowsummary'));
681*/
682      reportTable.appendChild(tableRow);
683    }
684  }
685
686  function createLinkStr(linkName, idStr, itemTypeStr, titleStr, sessionId)
687  {
688    var linkStr = '<span class="link" onclick="Main.itemOnClick(event, \'' + sessionId + '\', \'' + itemTypeStr + '\', ' + idStr + ', false)" title="' + titleStr + '">' + linkName + '</span>';
689    return linkStr;
690  }
691
692  function createTableCellElementHtml(html, clazz, colspan, rowspan)
693  {
694    var htmlStr = new String(html);
695    var cellElement = document.createElement('td');
696    cellElement.innerHTML = htmlStr;
697    cellElement.setAttribute('class', clazz);
698    if (colspan != null) cellElement.setAttribute('colspan', colspan);
699    if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
700   
701    return cellElement;
702  }
703 
704  function getJSONDataWithPercent(jsonObject, key, sumKey, numDecimals)
705  {
706    var dataNum = getJSONData(jsonObject, key);
707    var dataSum = getJSONData(jsonObject, sumKey);
708    var dataPct = '0';
709    if (dataSum != null || dataSum != 0)
710    {
711      dataPct = 100*dataNum/dataSum;
712      dataPct = dataPct.toFixed(numDecimals);
713    }
714    var data = dataNum + ' (' + dataPct + '%)';
715    return data;
716  }
717
718  function getJSONData(jsonObject, key)
719  {
720    var data = '';
721    if (jsonObject != null)
722    {
723      if (jsonObject[key] != null)
724      {
725        data = jsonObject[key];
726      }
727    }
728    else
729    {
730      data = 'jsonObject==null';
731    }
732    return data;
733  }
734
735  function addQuarterColumnHeaders(columnHeaderRow, startDate)
736  {
737    var currentDate = startDate;
738    for (var i=0;i<numCols;i++)
739    {
740      var quarter = Math.floor(currentDate.getMonth()/3)+1;
741      var columnText = 'Q'+quarter;
742      var quarterHeader = getTableCellElement(columnText, 'reportsubheader');
743      columnHeaderRow.appendChild(quarterHeader); 
744      currentDate.setMonth(currentDate.getMonth()+3);     
745    }
746  }
747 
748  function addWeekColumnHeaders(columnHeaderRow, startDate)
749  {
750    var currentDate = startDate;
751    var day = currentDate.getDay()-1;
752    day = day>=0 ? day: day + 7;
753    currentDate.setDate(currentDate.getDate()-day);
754    for (var i=0;i<numCols;i++)
755    {     
756      var weekNum = getISOWeekNumber(currentDate);
757      var columnText = weekNum;
758      if (weekNum < 10) columnText = '0'+columnText;     
759      columnHeaderRow.appendChild(getTableCellElement(columnText, 'reportsubheader'));
760      currentDate.setDate(currentDate.getDate()+7);     
761    }
762  }
763 
764  function addMonthColumnHeaders(columnHeaderRow, startDate)
765  {   
766    var currentDate = new Date(startDate.getFullYear(), startDate.getMonth());
767    for (var i=0;i<numCols;i++)
768    {             
769      var monthHeader = getTableCellElement(month[currentDate.getMonth()], 'reportsubheader');
770      columnHeaderRow.appendChild(monthHeader);       
771      currentDate.setMonth(currentDate.getMonth() +1);
772    }   
773  }
774 
775  function addYearSubHeaders(startDate, endDate, subHeaderRowYear, vt)
776  {   
777    var currentYear = startDate.getFullYear(); 
778   
779    var columnCounter = 0;   
780    do
781    {
782      var colspan;
783      var headerText = currentYear;
784      if (vt == "MONTH")
785      {
786        if (currentYear == startDate.getFullYear())
787        {
788          colspan =  11-startDate.getMonth()+1;
789          if (endDate.getFullYear() == currentYear)
790          {
791            colspan = colspan - (11-endDate.getMonth());
792          }
793        }
794        else if (currentYear == endDate.getFullYear()) 
795          colspan = endDate.getMonth()+1;
796        else
797          colspan = 12;
798      }
799      else if (vt == "WEEK")
800      { 
801        if (startDate.getFullYear() == endDate.getFullYear())
802        {
803          colspan = numCols;
804        }
805        else if (currentYear == startDate.getFullYear())
806        {
807          var startWeek = getISOWeekNumber(startDate);
808          var lastDay = new Date(startDate.getFullYear(), 11, 31);
809          var endWeek = getISOWeekNumber(lastDay);
810          if (endWeek == 1)
811          {
812            lastDay.setDate(lastDay.getDate()-7);
813            endWeek = getISOWeekNumber(lastDay);
814          }
815          colspan = endWeek - startWeek +1;
816        }
817        else if (currentYear == endDate.getFullYear())
818        {
819          var endWeek = getISOWeekNumber(endDate);
820          colspan = endWeek;
821        }
822        else
823        {
824          var dateInLastWeek = new Date(currentYear, 11, 31);
825          var endWeek = getISOWeekNumber(dateInLastWeek);
826          if (endWeek == 1)
827          {
828            dateInLastWeek.setDate(dateInLastWeek.getDate()-7);
829            endWeek = getISOWeekNumber(dateInLastWeek);
830          }
831          colspan = endWeek;
832        }               
833      }
834      else if (vt == "QUARTER")
835      {
836        if (currentYear == startDate.getFullYear())
837        {
838          if (startDate.getFullYear() == endDate.getFullYear())
839          {
840            colspan = Math.floor((endDate.getMonth()-startDate.getMonth())/3)+1;
841          }
842          else
843          {
844            colspan = Math.floor((11-startDate.getMonth())/3) +1;
845          }
846        }
847        else if(currentYear == endDate.getFullYear())
848        {
849          colspan = Math.floor(endDate.getMonth()/3)+1;
850        }
851        else 
852        {
853          colspan = 4;
854        }
855      }
856      else if (vt == "YEAR")
857      {
858        colspan = 1;       
859      }
860      columnCounter += colspan;           
861      subHeaderRowYear.appendChild(getTableCellElement(headerText, 'reportsubheader', colspan));
862    }while(!(++currentYear>endDate.getFullYear()));
863  }
864 
865  function addDataRowsToTable(report, reportTable)
866  {
867    var fdString = report.beginDate;
868    var ldString = report.endDate;
869    var psdString = report.periodBeginDate;
870    var startDate = new Date();
871    startDate.setYear(fdString.substr(0,4));
872    startDate.setMonth(fdString.substr(4,2)-1);
873    startDate.setDate(fdString.substr(6));
874    var endDate = new Date();
875    endDate.setYear(ldString.substr(0,4));
876    endDate.setMonth(ldString.substr(4,2)-1);
877    endDate.setDate(ldString.substr(6));
878    var periodStartDate = new Date();
879    periodStartDate.setYear(psdString.substr(0,4));
880    periodStartDate.setMonth(psdString.substr(4,2)-1);
881    periodStartDate.setDate(psdString.substr(6));
882    var viewType = report.viewType;   
883    var sites = report.sites;   
884    var statistics = report.statistics;
885    unknownCreation = statistics.noDate;
886    unknownSite = statistics.unknownSite;
887    for (namePrefix in sites)
888    {
889      if (!sites.hasOwnProperty(namePrefix)) continue;       
890      var site = sites[namePrefix];
891      var siteName = site.name;       
892      var year = site.startDate.substr(0,4);
893      var month = site.startDate.substr(5,2);
894      var date = site.startDate.substr(8,2);     
895      var siteStartDate = new Date(year, month-1, date);
896     
897      var siteData = statistics[namePrefix];     
898      var tableRow = document.createElement('tr');
899      var tableCol = getTableCellElement(siteName, 'rowtitle');
900      tableRow.appendChild(tableCol);
901      tableRow.appendChild(getTableCellElement(year+'-'+(month)+'-'+date, 'reportdata'));
902      var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());     
903      var columnCounter = 0;
904      do
905      {
906        var data = 0;
907        var keyIndex;
908        var yearIndex = currentDate.getFullYear();
909       
910        if (viewType == 'YEAR')
911        {
912          keyIndex = yearIndex;
913          if (siteData != null)
914          {
915            if (siteData[keyIndex] != null) data = siteData[keyIndex];
916          }
917          if ( (currentDate.getFullYear() < siteStartDate.getFullYear()))
918          {
919            data = '';
920          }
921          currentDate.setFullYear(currentDate.getFullYear()+1);
922        }
923        else if (viewType == 'QUARTER')
924        {
925          var qIndex = Math.floor(currentDate.getMonth()/3) + 1;
926          var startQuarter = Math.floor(siteStartDate.getMonth()/3)+1;
927          keyIndex = yearIndex + '' + qIndex;
928          if (siteData != null)
929          {
930            if (siteData[keyIndex] != null) data = siteData[keyIndex];           
931          }         
932          if ( (currentDate.getFullYear() <= siteStartDate.getFullYear()) && qIndex<startQuarter)
933          {
934            data = '';
935          }
936          currentDate.setMonth(currentDate.getMonth()+3);         
937        }
938        else if (viewType == 'MONTH')
939        {
940          var monthIndex = currentDate.getMonth()+1;
941          var rowFill = monthIndex < 10 ? '0' : '';
942          keyIndex = yearIndex + rowFill + monthIndex;
943          if (siteData != null)
944          {
945            if (siteData[keyIndex] != null) data = siteData[keyIndex];
946          }
947          if (currentDate.getFullYear() <= siteStartDate.getFullYear() && (monthIndex-1) < siteStartDate.getMonth())
948          {
949            data = '';
950          }
951         
952         
953          currentDate.setMonth(currentDate.getMonth()+1);
954        }
955        else if (viewType == 'WEEK')
956        {
957          var weekIndex = getISOWeekNumber(currentDate);
958          keyIndex = yearIndex + '' + weekIndex;
959          if (siteData != null)
960          {
961            if (siteData[keyIndex] != null) data = siteData[keyIndex];
962          }
963          if (currentDate.getFullYear() <= siteStartDate.getFullYear() && getISOWeekNumber(currentDate) < getISOWeekNumber(siteStartDate))
964          {
965            data = '';
966          }
967          currentDate.setDate(currentDate.getDate()+7);
968        }
969       
970        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
971        columnCounter++;       
972      } while (columnCounter < numCols)
973      // Add column with sample sum for site for the selected time period
974      var siteSum = 0;
975      if (siteData != null)
976      {
977        var sumSiteKey = 'sumSiteKey';
978        if (siteData[sumSiteKey] != null)
979        {
980          siteSum = siteData[sumSiteKey];
981        }
982      }
983      tableRow.appendChild(getTableCellElement(siteSum, 'rowsummary'));
984      // Add column with total number of samples for site, regardless of creation date
985      var siteTotal = 0;
986      if (siteData != null)
987      {
988        var totalSiteKey = 'totalSiteKey';
989        if (siteData[totalSiteKey] != null)
990        {
991          siteTotal = siteData[totalSiteKey];
992        }
993      }
994      tableRow.appendChild(getTableCellElement(siteTotal, 'rowsummary'));
995      reportTable.appendChild(tableRow);
996    }
997  }
998 
999  function createSortedPeriodArray(report, numberOfColumns)
1000  {
1001    var psdString = report.periodBeginDate;
1002    var periodStartDate = new Date();
1003    periodStartDate.setYear(psdString.substr(0,4));
1004    periodStartDate.setMonth(psdString.substr(4,2)-1);
1005    periodStartDate.setDate(psdString.substr(6));
1006    var viewType = report.viewType;   
1007    var sortedPeriodArray = Array(numberOfColumns);
1008    var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());     
1009    var columnCounter = 0;
1010    do
1011    { 
1012      var keyIndex;
1013      var yearIndex = currentDate.getFullYear();
1014       
1015      if (viewType == 'YEAR')
1016      {
1017        keyIndex = yearIndex;
1018        currentDate.setFullYear(currentDate.getFullYear()+1);
1019      }
1020      else if (viewType == 'QUARTER')
1021      {
1022        var qIndex = Math.floor(currentDate.getMonth()/3) + 1;
1023        keyIndex = yearIndex + '' + qIndex;
1024        currentDate.setMonth(currentDate.getMonth()+3);         
1025      }
1026      else if (viewType == 'MONTH')
1027      {
1028        var monthIndex = currentDate.getMonth()+1;
1029        var rowFill = monthIndex < 10 ? '0' : '';
1030        keyIndex = yearIndex + rowFill + monthIndex;
1031        currentDate.setMonth(currentDate.getMonth()+1);
1032      }
1033      else if (viewType == 'WEEK')
1034      {
1035        var weekIndex = getISOWeekNumber(currentDate);
1036        keyIndex = yearIndex + '' + weekIndex;
1037        currentDate.setDate(currentDate.getDate()+7);
1038      }
1039      sortedPeriodArray[columnCounter] = keyIndex;
1040      columnCounter++;       
1041    } while (columnCounter < numberOfColumns)
1042    return sortedPeriodArray;
1043  }
1044 
1045  function getReportTable()
1046  {
1047      var reportTable = document.createElement('table');
1048      reportTable.setAttribute('class','reporttable');
1049      reportTable.setAttribute('border','1');     
1050      return reportTable;
1051  }
1052 
1053  function getTableCellElement(text, clazz, colspan, rowspan)
1054  {
1055    var cellElement = document.createElement('td');
1056    text = new String(text);   
1057    var textArray = text.split("\n");   
1058    if (textArray.length > 1)
1059    {
1060      for (var i=0;i<textArray.length;i++)
1061      {       
1062        if (i>0)cellElement.appendChild(document.createElement('br'));
1063        cellElement.appendChild(document.createTextNode(textArray[i]));
1064      }     
1065    }
1066    else
1067    {
1068      cellElement.appendChild(document.createTextNode(text));
1069    }
1070    cellElement.setAttribute('class', clazz);
1071    if (colspan != null) cellElement.setAttribute('colspan', colspan);
1072    if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
1073   
1074    return cellElement;
1075  }
1076 
1077  function getListElement(itemText)
1078  {
1079    var listElement = document.createElement('li');
1080    var textNode = document.createTextNode(itemText);
1081    listElement.appendChild(textNode);
1082    return listElement;
1083  }
1084
1085  /*
1086   * Get the ISO week number for a given date
1087   *
1088   * Based on code at http://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php
1089   */
1090  function getISOWeekNumber(date)
1091  {
1092    tmpDate = new Date(date);
1093    tmpDate.setHours(0,0,0);
1094    // Set to nearest Thursday: current date + 4 - current day number
1095    // Make Sunday day number 7
1096    tmpDate.setDate(tmpDate.getDate() + 4 - (tmpDate.getDay() || 7));
1097    // Get first day of year
1098    var yearStart = new Date(tmpDate.getFullYear(), 0, 1);
1099    // Calculate full weeks to nearast Thursday (86400000 = 24*60*60*1000 number of ms in a day)
1100    var weekNo = Math.ceil(( ( (tmpDate - yearStart) / 86400000) + 1)/7);
1101    return weekNo;
1102  }
1103
1104  </script>
1105 
1106 
1107  </base:head>
1108  <base:body onload="init()">
1109    <p:path><p:pathelement 
1110      title="Reggie" href="<%="index.jsp?ID="+ID%>" 
1111      /><p:pathelement title="Report generator" 
1112      /></p:path>
1113    <div class="content">
1114    <%
1115    if (sc.getActiveProjectId() == 0)
1116    {
1117      %>
1118      <div class="messagecontainer note" style="width: 950px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
1119        No project has been selected. You may proceed with the report generation but
1120        only your own items will be included in the report.
1121      </div>
1122      <%
1123    }
1124    %>
1125 
1126    <form name="reggie" onsubmit="return false;">
1127      <!-- 1. Report type-->
1128      <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1129      <tr>
1130        <td rowspan="3" class="stepno">1</td>
1131        <td class="steptitle">Report type</td>
1132      </tr>
1133      <tr>
1134        <td class="stepfields">
1135          <table border="0" cellspacing="0" cellpadding="0" width="100%">
1136          <tr valign="top">
1137            <td class="prompt">Report</td>
1138            <td class="input">
1139              <select name="reporttype">
1140                <option value="samplecount" selected="yes">Sample count report</option>
1141                <option value="consentcount">Consent count report</option>
1142              </select>
1143            </td>
1144            <td class="status" id="report.status"></td>
1145            <td class="help">
1146              <span id="report.message" class="message" style="display: none;"></span>
1147              Select which report to generate.
1148            </td>
1149          </tr>
1150          </table>
1151        </td>
1152      </tr>
1153      </table>
1154     
1155      <div id="sampleCountSection" style="display:none;">
1156        <p></p>
1157        <!-- 2. Report parameters-->
1158        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1159        <tr>
1160          <td rowspan="3" class="stepno">2</td>
1161          <td class="steptitle">Report parameters</td>
1162        </tr>
1163        <tr>
1164          <td class="stepfields">
1165            <table border="0" cellspacing="0" cellpadding="0" width="100%">           
1166            <tr>
1167              <td valign="top" class="prompt">Report period</td>
1168              <td valign="top" class="input">
1169                From<input type="text" onChange="dateOnChange()" size=7 name="fromdate"/>&nbsp;
1170                To<input type="text" onChange="dateOnChange()" size=7 name="todate" />
1171              </td>
1172              <td valign="top" class="status" id="displayInterval.status"></td>
1173              <td class="help">
1174                <span id="displayInterval.message" class="message" style="display: none;"></span>
1175                Define which period the report should cover. Empty fields will include all tubes.<br>
1176              </td>
1177            </tr> 
1178            <tr>         
1179              <td valign="top" class="prompt">View type</td>
1180              <td valign="top" class="input">
1181                <select name="viewtype">
1182                  <option value="AUTO" selected="yes">Auto</option>
1183                  <option value="WEEK">Week</option>
1184                  <option value="MONTH">Month</option>
1185                  <option value="QUARTER">Quarter</option>
1186                  <option value="YEAR">Year</option>
1187                </select>
1188              </td>
1189              <td valign="top" class="status" id="displayViewType.status"></td>
1190              <td class="help">
1191                <span id="displayViewType.message" class="message" style="display: none;"></span>
1192                Auto will adjust the report depending on the size of the period.
1193                <ul>
1194                  <li>Period shorter then 3 months - specimens per week</li>
1195                  <li>Period shorter then 13 months - specimens per month</li>
1196                  <li>Period shorter then 3 year - specimens per quarter</li>
1197                  <li>Period is 3 year or greater - specimens per year</li>
1198                </ul>                 
1199              </td>
1200            </tr>
1201            </table>
1202          </td>
1203        </tr>
1204        </table>
1205      </div>
1206     
1207      <div id="consentCountSection" style="display:none;">
1208        <p></p>
1209        <!-- 2. Report parameters-->
1210        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1211        <tr>
1212          <td rowspan="3" class="stepno">2</td>
1213          <td class="steptitle">Report parameters</td>
1214        </tr>
1215        <tr>
1216          <td class="stepfields">
1217            <table border="0" cellspacing="0" cellpadding="0" width="100%">           
1218            <tr>
1219              <td valign="top" class="prompt">No report parameters</td>
1220              <td valign="top" class="input">
1221              </td>
1222              <td valign="top" class="status" id="displayInterval.status"></td>
1223              <td class="help">
1224                <span id="displayInterval.message" class="message" style="display: none;"></span>
1225                Consent report will be generated irrespective of date for consent.<br>
1226              </td>
1227            </tr> 
1228            </table>
1229          </td>
1230        </tr>
1231        </table>
1232      </div>
1233     
1234      <div id="reportSection" style="display:none;">
1235        <p></p>
1236        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
1237        <tr>
1238          <td rowspan="3" class="stepno">3</td>
1239          <td class="steptitle">Generated report</td>
1240        </tr>
1241        <tr>
1242          <td id="reportcell" class="stepfields">
1243            <i>Generating report...</i>
1244          </td>
1245        </tr>
1246        </table>
1247      </div> 
1248     
1249      <div class="messagecontainer error" id="errorMessage" style="display: none; width: 950px; margin-left: 20px; margin-bottom: 0px;"></div>   
1250       
1251      <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
1252        <tr>
1253          <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
1254          <td><base:button id="gonext" title="Next" image="<%=home+"/images/gonext.png"%>" onclick="goNext(true)" /></td>
1255          <td><base:button id="gocreate" title="Generate" image="<%=home+"/images/gonext.png"%>" onclick="goCreate()" style="display: none;"/></td>         
1256          <td><base:button id="gorestart" title="Restart" image="<%=home+"/images/goback.png"%>" onclick="goRestart(true)" style="display: none;"/></td>
1257          <td id="gonext.message" class="message"></td>
1258        </tr>
1259      </table>     
1260    </form>
1261    </div>
1262   
1263  </base:body>
1264  </base:page>
1265  <%
1266}
1267finally
1268{
1269  if (dc != null) dc.close();
1270}
1271%>
Note: See TracBrowser for help on using the repository browser.