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

Last change on this file since 1495 was 1495, checked in by Martin Svensson, 11 years ago

References #339 Removed debug-print and corrected a couple of miscalculations when generating estimating the number of columns.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 20.9 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.clients.web.Base" 
8%>
9<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
10<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
11<%
12final SessionControl sc = Base.getExistingSessionControl(request, true);
13final String ID = sc.getId();
14final float scale = Base.getScale(sc);
15DbControl dc = null;
16try
17{
18  dc = sc.newDbControl();
19  final User user = User.getById(dc, sc.getLoggedInUserId());
20  %>
21  <base:page type="default" >
22  <base:head scripts="ajax.js" styles="path.css">
23    <link rel="stylesheet" type="text/css" href="reggie.css">
24    <script language="JavaScript" src="reggie.js" type="text/javascript" charset="UTF-8"></script>
25   
26   
27  <script language="JavaScript">
28  var currentStep = 1;
29  var debug = false;
30  var sitesCombined;
31  var numCols;
32 
33  var month=new Array(12);
34    month[0]="Jan";
35    month[1]="Feb";
36    month[2]="Mar";
37    month[3]="Apr";
38    month[4]="May";
39    month[5]="Jun";
40    month[6]="Jul";
41    month[7]="Aug";
42    month[8]="Sep";
43    month[9]="Oct";
44    month[10]="Nov";
45    month[11]="Dec";
46 
47  var intervalIsValid = true;
48 
49  function goNext()
50  {
51    if (currentStep == 1)
52    {
53      gotoStep2();
54    }
55  }
56 
57  function gotoStep2()
58  {
59    var frm = document.forms['reggie'];
60    frm.reporttype.disabled = true;
61    if (frm.reporttype[frm.reporttype.selectedIndex].value == 'samplecount')
62    {
63      Main.show('sampleCountSection');
64    }
65       
66    Main.show('gocreate');   
67    Main.hide('gonext');
68    frm.fromdate.focus();
69    currentStep = 2;
70  }
71 
72  function dateOnChange()
73  {
74    var frm = document.forms['reggie'];   
75    var fdate;
76    var tdate;
77   
78    intervalIsValid = false;
79    setInputStatus('displayInterval','','valid');
80    if (frm.fromdate.value != null && frm.fromdate.value != '')
81    {
82      frm.fromdate.value = autoFillDate(frm.fromdate.value);     
83      if (!Dates.isDate(frm.fromdate.value, 'yyyyMMdd'))
84      {
85        setInputStatus('displayInterval','Not a valid from-date', 'invalid');
86        return;
87      }
88      else
89      {
90        fdate = frm.fromdate.value;
91        fdate = new Date(fdate.substr(0,4), parseInt(fdate.substr(4,2))-1, fdate.substr(6,2));
92      }
93    }
94   
95    if (frm.todate.value != null && frm.todate.value != '')
96    {
97      frm.todate.value = autoFillDate(frm.todate.value);
98      if (!Dates.isDate(frm.todate.value, 'yyyyMMdd'))
99      {
100        setInputStatus('displayInterval', 'Not a valid to-date', 'invalid');
101        return;
102      }
103      else
104      {
105        tdate = frm.todate.value;
106        tdate = new Date(tdate.substr(0,4), parseInt(tdate.substr(4,2))-1, tdate.substr(6,2));
107      }
108    }
109   
110    if (tdate != null && fdate != null)
111    {
112      if (fdate > tdate)
113      {
114        setInputStatus('displayInterval', 'Invalid period', 'invalid')
115        return;
116      }     
117    }
118    intervalIsValid = true;
119  }
120 
121  function goCreate()
122  {
123    if (!intervalIsValid) return;
124    var cellElement = document.getElementById('reportcell');
125    var frm = document.forms['reggie'];   
126    frm.fromdate.disabled = true;
127    frm.todate.disabled = true;
128    Main.hide('gocreate');
129    Main.show('reportSection');
130    var reportType = frm.reporttype[frm.reporttype.selectedIndex].value;   
131    var url = 'SampleReport.servlet?ID=<%=ID%>&cmd='+reportType;   
132   
133    if (reportType == 'samplecount')
134    {     
135      if (frm.fromdate.value != null) url += '&fdate='+frm.fromdate.value;
136      if (frm.todate.value != null) url += '&tdate='+frm.todate.value;
137    }
138    var request = Ajax.getXmlHttpRequest();
139    request.open("GET", url, false);
140    request.send(null);
141   
142    if (debug) Main.debug(request.responseText);   
143    var response = JSON.parse(request.responseText); 
144    if (response.status != 'ok')
145    {
146      setFatalError(response.message);
147      return false;
148    }
149    var report = response.report;
150    var reportTable;
151   
152    if (report != null)
153    {
154      if ('samplecount' == reportType)
155      {     
156        reportTable = createSampleCountReport(report);
157      }
158    }
159    else
160    {
161      var messageCell = getTableCellElement('No values could be found during given period', 'reportheader');
162      var messageRow = document.createElement('tr');
163      messageRow.appendChild(messageCell);     
164      var messageTable = getReportTable();
165      messageTable.appendChild(messageRow);
166      reportTable = messageTable;     
167    }
168    setInnerHTML('reportcell', '');
169    cellElement.appendChild(reportTable);
170    Main.show('gorestart');   
171  }
172 
173  function createSampleCountReport(report)
174  {
175    var reportTable = getReportTable();
176    var sdString = report.beginDate;
177    var edString = report.endDate;   
178    var startDate = new Date();
179    startDate.setYear(sdString.substr(0,4));
180    startDate.setMonth(sdString.substr(4,2)-1);
181    startDate.setDate(sdString.substr(6));
182    var endDate = new Date();
183    endDate.setYear(edString.substr(0,4));
184    endDate.setMonth(edString.substr(4,2)-1);
185    endDate.setDate(edString.substr(6));
186    var viewType = report.viewType;   
187 
188    var headerRow = document.createElement('tr');   
189    var subHeaderRowYear = document.createElement('tr');
190    var columnHeaderRow = document.createElement('tr');
191   
192    var headerText = '# Specimen by ';
193    if (viewType == 'WEEK')
194    {
195      var startWeek = getWeekByDate(startDate);
196      var endWeek = getWeekByDate(endDate);
197      var tempDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate()-startDate.getDay()+1);
198      numCols = 0;
199      while (tempDate < endDate)
200      {
201        numCols++;
202        tempDate.setDate(tempDate.getDate()+7);
203      }
204      headerText += 'weeks';
205    }
206    else if (viewType == 'MONTH')
207    {
208      numCols = (endDate.getFullYear()-startDate.getFullYear())*12 + endDate.getMonth()-startDate.getMonth()+1;
209      headerText += 'months';
210    }
211    else if (viewType == 'QUARTER')
212    {
213      numCols = (endDate.getFullYear()-startDate.getFullYear())*4 + Math.ceil((endDate.getMonth()-startDate.getMonth())/3)+1;
214      headerText += 'quarters';
215    }
216    else
217    {
218      numCols = endDate.getFullYear() - startDate.getFullYear() + 1;
219      headerText += 'years';
220    }
221    sitesCombined = Array(numCols);
222     
223    // Set table header
224    headerText += '\n(' + startDate.getFullYear()+'-';
225    if ((startDate.getMonth()+1) < 10) headerText += '0' + (startDate.getMonth()+1);
226    else headerText += (startDate.getMonth()+1);
227    headerText += '-';
228    if (startDate.getDate() < 10) headerText += '0' + startDate.getDate();
229    else headerText += startDate.getDate();
230    headerText += ' through ';
231    headerText += endDate.getFullYear()+'-';
232    if ((endDate.getMonth()+1) < 10) headerText += '0' + (endDate.getMonth()+1);
233    else headerText += (endDate.getMonth()+1);
234    headerText += '-';
235    if (endDate.getDate() < 10) headerText += '0' + endDate.getDate();
236    else headerText += endDate.getDate();
237    headerText += ')';   
238    headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+3)));
239   
240    // Sub headers
241    // Only if each datacol is less then a year
242    if (viewType != 'YEAR')
243    {
244      subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader', 2));
245      addYearSubHeaders(startDate, endDate, subHeaderRowYear, viewType);     
246      subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader'));
247    }   
248         
249    // Columnsheader   
250    var siteHeader = getTableCellElement('Site', 'reportsubheader');     
251    var startDateHeader = getTableCellElement('Start date','reportsubheader');
252    columnHeaderRow.appendChild(siteHeader);
253    columnHeaderRow.appendChild(startDateHeader); 
254   
255    if (viewType == 'MONTH') addMonthColumnHeaders(columnHeaderRow, startDate);
256    else if (viewType == 'WEEK') addWeekColumnHeaders(columnHeaderRow, startDate);
257    else if (viewType == 'QUARTER') addQuarterColumnHeaders(columnHeaderRow, startDate);
258    else if (viewType == 'YEAR') addYearSubHeaders(startDate, endDate, columnHeaderRow, viewType);
259   
260   
261    columnHeaderRow.appendChild(getTableCellElement('Grand\ntotal', 'reportsubheader'));
262
263    // Build table     
264    reportTable.appendChild(headerRow);
265    reportTable.appendChild(subHeaderRowYear);
266    reportTable.appendChild(columnHeaderRow);
267         
268    // Data rows     
269    addDataRowsToTable(report, reportTable);
270     
271    // Add a row with the combined number of each month-column
272    var sitesCombinedRow = document.createElement('tr');
273    sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
274    sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary'));
275    var gt = 0;
276    for (key in sitesCombined)
277    {
278      sitesCombinedRow.appendChild(getTableCellElement(sitesCombined[key],'colsummary'));
279      if (sitesCombined[key] != '') gt += sitesCombined[key];
280    }
281    sitesCombinedRow.appendChild(getTableCellElement(gt, 'colsummary'));
282    reportTable.appendChild(sitesCombinedRow); 
283    return reportTable;
284  }
285 
286  function addQuarterColumnHeaders(columnHeaderRow, startDate)
287  {
288    var currentDate = startDate;
289    for (var i=0;i<numCols;i++)
290    {
291      var quarter = Math.floor(currentDate.getMonth()/3)+1;
292      var columnText = 'Q'+quarter;
293      var quarterHeader = getTableCellElement(columnText, 'reportsubheader');
294      columnHeaderRow.appendChild(quarterHeader); 
295      currentDate.setMonth(currentDate.getMonth()+3);     
296    }
297  }
298 
299  function addWeekColumnHeaders(columnHeaderRow, startDate)
300  {
301    var currentDate = startDate;
302    var day = currentDate.getDay()-1;
303    day = day>=0 ? day: day + 7;
304    currentDate.setDate(currentDate.getDate()-day);
305    for (var i=0;i<numCols;i++)
306    {     
307      var weekNum = getWeekByDate(currentDate);
308      var columnText = weekNum;
309      if (weekNum < 10) columnText = '0'+columnText;     
310      columnHeaderRow.appendChild(getTableCellElement(columnText, 'reportsubheader'));
311      currentDate.setDate(currentDate.getDate()+7);     
312    }
313  }
314 
315  function addMonthColumnHeaders(columnHeaderRow, startDate)
316  {   
317    var currentDate = new Date(startDate.getFullYear(), startDate.getMonth());
318    for (var i=0;i<numCols;i++)
319    {             
320      var monthHeader = getTableCellElement(month[currentDate.getMonth()], 'reportsubheader');
321      columnHeaderRow.appendChild(monthHeader);       
322      currentDate.setMonth(currentDate.getMonth() +1);
323    }   
324  }
325 
326  function addYearSubHeaders(startDate, endDate, subHeaderRowYear, vt)
327  {   
328    var currentYear = startDate.getFullYear(); 
329   
330    var columnCounter = 0;   
331    do
332    {
333      var colspan;
334      var headerText = currentYear;
335      if (vt == "MONTH")
336      {
337        if (currentYear == startDate.getFullYear())
338        {
339          colspan =  11-parseInt(startDate.getMonth())+1;
340          if (endDate.getFullYear() == currentYear)
341          {
342            colspan = colspan - (11-parseInt(endDate.getMonth()));
343          }
344        }
345        else if (currentYear == endDate.getFullYear()) 
346          colspan = parseInt(endDate.getMonth()+1);
347        else
348          colspan = 12;
349      }
350      else if (vt == "WEEK")
351      { 
352        if (startDate.getFullYear() == endDate.getFullYear())
353        {
354          colspan = numCols;
355        }
356        else if (currentYear == startDate.getFullYear())
357        {
358          var startWeek = getWeekByDate(startDate);
359          var lastDay = new Date(startDate.getFullYear(), 11, 31);
360          var endWeek = getWeekByDate(lastDay);
361          if (endWeek == 1) endWeek = getWeekByDate(lastDay.setDate(lastDay.getDate()-7));
362          colspan = endWeek - startWeek +1;
363        }
364        else if (currentYear == endDate.getFullYear())
365        {
366          var endWeek = getWeekByDate(endDate);
367          colspan = endWeek;
368        }
369        else
370        {
371          var dateInLastWeek = new Date(currentYear, 11, 31);
372          var endWeek = getWeekByDate(dateInLastWeek);
373          if (endWeek == 1) endWeek = getWeekByDate(dateInLastWeek.setDate(dateInLastWeek.getDate()-7));
374          colspan = endWeek;
375        }               
376      }
377      else if (vt == "QUARTER")
378      {
379        if (currentYear == startDate.getFullYear())
380        {
381          if (startDate.getFullYear() == endDate.getFullYear())
382          {
383            colspan = Math.floor((endDate.getMonth()-startDate.getMonth())/3)+1;
384          }
385          else
386          {
387            colspan = Math.floor((11-startDate.getMonth())/3) +1;
388          }
389        }
390        else if(currentYear == endDate.getFullYear())
391        {
392          colspan = Math.floor(endDate.getMonth()/3)+1;
393        }
394        else 
395        {
396          colspan = 4;
397        }
398      }
399      else if (vt == "YEAR")
400      {
401        colspan = 1;       
402      }
403      columnCounter += colspan;           
404      subHeaderRowYear.appendChild(getTableCellElement(headerText, 'reportsubheader', colspan));
405    }while(!(++currentYear>endDate.getFullYear()));
406  }
407 
408  function addDataRowsToTable(report, reportTable)
409  {
410    var fdString = report.beginDate;
411    var ldString = report.endDate;
412    var startDate = new Date();
413    startDate.setYear(fdString.substr(0,4));
414    startDate.setMonth(fdString.substr(4,2)-1);
415    startDate.setDate(fdString.substr(6));
416    var endDate = new Date();
417    endDate.setYear(ldString.substr(0,4));
418    endDate.setMonth(ldString.substr(4,2)-1);
419    endDate.setDate(ldString.substr(6));
420    var viewType = report.viewType;
421   
422    var sites = report.sites;
423    for (namePrefix in sites)
424    {
425      if (!sites.hasOwnProperty(namePrefix)) continue;       
426      var site = sites[namePrefix];
427      var siteName = site.name;       
428      var year = site.startdate.substr(0,4);
429      var month = site.startdate.substr(5,2);
430      var date = site.startdate.substr(8,2);     
431      var siteStartDate = new Date(year, month-1, date);
432     
433      var siteData = report[namePrefix];
434      var tableRow = document.createElement('tr');
435      var tableCol = getTableCellElement(siteName, 'rowtitle');
436      tableRow.appendChild(tableCol);
437      tableRow.appendChild(getTableCellElement(year+'-'+(month)+'-'+date, 'reportdata'));
438      var currentDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate());     
439      var grandTotal = 0;
440      var columnCounter = 0;
441      do
442      {
443        var data = 0;
444        var keyIndex;
445        var yearIndex = currentDate.getFullYear();
446       
447        if (viewType == 'YEAR')
448        {
449          keyIndex = yearIndex;
450          if (siteData != null)
451          {
452            if (siteData[keyIndex] != null) data = siteData[keyIndex];
453          }
454          grandTotal += data;         
455          if (currentDate.getFullYear() < siteStartDate.getFullYear()) data = '';
456          else if (sitesCombined[keyIndex] == null) sitesCombined[keyIndex] = data;
457          else sitesCombined[keyIndex] += data;
458          currentDate.setFullYear(currentDate.getFullYear()+1);
459        }
460        else if (viewType == 'QUARTER')
461        {
462          var qIndex = Math.floor(currentDate.getMonth()/3) + 1;
463          var startQuarter = Math.floor(siteStartDate.getMonth()/3)+1;
464          keyIndex = yearIndex + '' + qIndex;
465          if (siteData != null)
466          {
467            if (siteData[keyIndex] != null) data = siteData[keyIndex];           
468          }         
469          grandTotal += data;
470          if ( currentDate.getFullYear() <= siteStartDate.getFullYear() && qIndex<startQuarter)
471          {
472            data = '';
473            if (sitesCombined[keyIndex] == null) sitesCombined[keyIndex] = data;
474          }
475          else if (sitesCombined[keyIndex] == null || sitesCombined[keyIndex] == '') sitesCombined[keyIndex] = data;
476          else sitesCombined[keyIndex] += data;
477          currentDate.setMonth(currentDate.getMonth()+3);         
478        }
479        else if (viewType == 'MONTH')
480        {
481          var monthIndex = currentDate.getMonth()+1;
482          var rowFill = monthIndex < 10 ? '0' : '';
483          keyIndex = yearIndex + rowFill + monthIndex;
484          if (siteData != null)
485          {
486            if (siteData[keyIndex] != null) data = siteData[keyIndex];
487          }
488          grandTotal += data;         
489          if (currentDate.getFullYear() <= siteStartDate.getFullYear() && (monthIndex-1) < siteStartDate.getMonth())
490          {
491            data = '';
492            if (sitesCombined[keyIndex] == null) sitesCombined[keyIndex] = data;
493          }
494          else if (sitesCombined[keyIndex] == null || sitesCombined[keyIndex] == '') sitesCombined[keyIndex] = data;
495          else sitesCombined[keyIndex] += data;
496         
497         
498          currentDate.setMonth(currentDate.getMonth()+1);
499        }
500        else if (viewType == 'WEEK')
501        {
502          var weekIndex = getWeekByDate(currentDate);
503          keyIndex = yearIndex + '' + weekIndex;
504          if (siteData != null)
505          {
506            if (siteData[keyIndex] != null) data = siteData[keyIndex];
507          }
508          grandTotal += data;         
509          if (currentDate.getFullYear() <= siteStartDate.getFullYear() && getWeekByDate(currentDate) < getWeekByDate(siteStartDate))
510          {
511            data = '';
512            if (sitesCombined[keyIndex] == null) sitesCombined[keyIndex] = data;
513          }
514          else if (sitesCombined[keyIndex] == null || sitesCombined[keyIndex] == '') sitesCombined[keyIndex] = data;
515          else sitesCombined[keyIndex] += data;
516          currentDate.setDate(currentDate.getDate()+7);
517        }
518       
519        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
520        columnCounter++;       
521      }while (columnCounter< numCols)     
522      tableRow.appendChild(getTableCellElement(parseInt(grandTotal), 'rowsummary'));
523      reportTable.appendChild(tableRow);
524    }
525  }
526 
527  function getReportTable()
528  {
529      var reportTable = document.createElement('table');
530      reportTable.setAttribute('class','reporttable');
531      reportTable.setAttribute('border','1');     
532      return reportTable;
533  }
534 
535  function getTableCellElement(text, clazz, colspan, rowspan)
536  {
537    var cellElement = document.createElement('td');
538    text = new String(text);   
539    var textArray = text.split("\n");   
540    if (textArray.length > 1)
541    {
542      for (var i=0;i<textArray.length;i++)
543      {       
544        if (i>0)cellElement.appendChild(document.createElement('br'));
545        cellElement.appendChild(document.createTextNode(textArray[i]));
546      }     
547    }
548    else
549    {
550      cellElement.appendChild(document.createTextNode(text));
551    }
552    cellElement.setAttribute('class', clazz);
553    if (colspan != null) cellElement.setAttribute('colspan', colspan);
554    if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
555   
556    return cellElement;
557  }
558  </script>
559 
560 
561  </base:head>
562  <base:body onload="init()">
563    <p:path style="margin-top: 20px; margin-bottom: 10px;">
564      <p:pathelement title="Reggie" href="<%="index.jsp?ID="+ID%>" />
565      <p:pathelement title="Report generator" />
566    </p:path>
567   
568    <%
569    if (sc.getActiveProjectId() == 0)
570    {
571      %>
572      <base:note type="warning" style="width: 800px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
573        No project has been selected. You may proceed with the report generation but
574        only your own items will be included in the report.
575      </base:note>
576      <%
577    }
578    %>
579 
580    <form name="reggie" onsubmit="return false;">
581      <!-- 1. Report type-->
582      <table border="0" cellspacing="0" cellpadding="0" class="stepform">
583      <tr>
584        <td rowspan="3" class="stepno">1</td>
585        <td class="steptitle">Report type</td>
586      </tr>
587      <tr>
588        <td class="stepfields">
589          <table border="0" cellspacing="0" cellpadding="0" width="100%">
590          <tr valign="top">
591            <td class="prompt">Report</td>
592            <td class="input">
593              <select name="reporttype">
594                <option value="samplecount">Sample count report</option>
595              </select>
596            </td>
597            <td class="status" id="report.status"></td>
598            <td class="help">
599              <span id="report.message" class="message" style="display: none;"></span>
600              Select which report to generate.
601            </td>
602          </tr>
603          </table>
604        </td>
605      </tr>
606      </table>
607     
608      <div id="sampleCountSection" style="display:none;">
609        <p></p>
610        <!-- 2. Report parameters-->
611        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
612        <tr>
613          <td rowspan="3" class="stepno">2</td>
614          <td class="steptitle">Report parameters</td>
615        </tr>
616        <tr>
617          <td class="stepfields">
618            <table border="0" cellspacing="0" cellpadding="0" width="100%">           
619            <tr>
620              <td valign="top" class="prompt">Report period</td>
621              <td valign="top" class="input">
622                From<input type="text" onChange="dateOnChange()" size=7 name="fromdate"/>&nbsp;
623                To<input type="text" onChange="dateOnChange()" size=7 name="todate" />
624              </td>
625              <td valign="top" class="status" id="displayInterval.status"></td>
626              <td class="help">
627                <span id="displayInterval.message" class="message" style="display: none;"></span>
628                Define which period the report should cover. Empty fields will include all tubes.<br>
629                The report will adjust itself depending on the size of the period.
630                <ul>
631                  <li>Period shorter then 3 months - specimens per week</li>
632                  <li>Period shorter then 13 months - specimens per month</li>
633                  <li>Period shorter then 3 year - specimens per quarter</li>
634                  <li>Period is 3 year or greater - specimens per year</li>
635                </ul>                 
636              </td>
637            </tr>           
638            </table>
639          </td>
640        </tr>
641        </table>
642      </div>
643     
644      <div id="reportSection" style="display:none;">
645        <p></p>
646        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
647        <tr>
648          <td rowspan="3" class="stepno">3</td>
649          <td class="steptitle">Generated report</td>
650        </tr>
651        <tr>
652          <td id="reportcell" class="stepfields">
653            <i>Generating report...</i>
654          </td>
655        </tr>
656        </table>
657      </div> 
658     
659      <div class="error" id="errorMessage" style="display: none; width: 800px; margin-left: 20px; margin-bottom: 0px;"></div>   
660       
661      <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
662        <tr>
663          <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
664          <td><base:button id="gonext" title="Next" image="gonext.gif" onclick="goNext(true)" /></td>
665          <td><base:button id="gocreate" title="Generate" image="gonext.gif" onclick="goCreate()" style="display: none;"/></td>         
666          <td><base:button id="gorestart" title="Restart" image="goback.gif" onclick="goRestart(true)" style="display: none;"/></td>
667          <td id="gonext.message" class="message"></td>
668        </tr>
669      </table>     
670    </form>
671  </base:body>
672  </base:page>
673  <%
674}
675finally
676{
677  if (dc != null) dc.close();
678}
679%>
Note: See TracBrowser for help on using the repository browser.