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

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

References #339 The report-generator has been re-made. The columns are now automatically adjusting to the period given by the user.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 20.6 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 = true;
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    cellElement.appendChild(reportTable);   
169    Main.show('gorestart');   
170  }
171 
172  function createSampleCountReport(report)
173  {
174    var reportTable = getReportTable();
175    var sdString = report.startDate;
176    var edString = report.endDate;
177    var ldString = report.latestDate;   
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 latestDate = new Date();
187    latestDate.setYear(ldString.substr(0,4));
188    latestDate.setMonth(ldString.substr(4,2)-1);
189    latestDate.setDate(ldString.substr(6));
190    var viewType = report.viewType;   
191 
192    var headerRow = document.createElement('tr');   
193    var subHeaderRowYear = document.createElement('tr');
194    var columnHeaderRow = document.createElement('tr');
195   
196    var headerText = '# Specimen by ';
197    if (viewType == 'WEEK')
198    {
199      var startWeek = getWeekByDate(startDate);
200      var endWeek = getWeekByDate(endDate);
201      var tempDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate()-startDate.getDay()+1);
202      numCols = 0;
203      while (tempDate < endDate)
204      {
205        numCols++;
206        tempDate.setDate(tempDate.getDate()+7);
207      }
208      headerText += 'weeks';
209    }
210    else if (viewType == 'MONTH')
211    {
212      numCols = (endDate.getFullYear()-startDate.getFullYear())*12 + endDate.getMonth()-startDate.getMonth()+1;
213      headerText += 'months';
214    }
215    else if (viewType == 'QUARTER')
216    {
217      numCols = (endDate.getFullYear()-startDate.getFullYear())*4 + Math.ceil((endDate.getMonth()-startDate.getMonth())/3);
218      headerText += 'quarters';
219    }
220    else
221    {
222      numCols = endDate.getFullYear() - startDate.getFullYear() + 1;
223      headerText += 'years';
224    }
225    sitesCombined = Array(numCols);
226     
227    // Set table header
228    headerText += '\n(' + startDate.getFullYear()+'-';
229    if ((startDate.getMonth()+1) < 10) headerText += '0' + (startDate.getMonth()+1);
230    else headerText += (startDate.getMonth()+1);
231    headerText += '-';
232    if (startDate.getDate() < 10) headerText += '0' + startDate.getDate();
233    else headerText += startDate.getDate();
234    headerText += ' through ';
235    headerText += endDate.getFullYear()+'-';
236    if ((endDate.getMonth()+1) < 10) headerText += '0' + (endDate.getMonth()+1);
237    else headerText += (endDate.getMonth()+1);
238    headerText += '-';
239    if (endDate.getDate() < 10) headerText += '0' + endDate.getDate();
240    else headerText += endDate.getDate();
241    headerText += ')';   
242    headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+3)));
243   
244    // Sub headers
245    // Only if each datacol is less then a year
246    if (viewType != 'YEAR')
247    {
248      subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader', 2));
249      addYearSubHeaders(startDate, endDate, latestDate, subHeaderRowYear, viewType);     
250      subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader'));
251    }   
252         
253    // Columnsheader   
254    var siteHeader = getTableCellElement('Site', 'reportsubheader');     
255    var startDateHeader = getTableCellElement('Start date','reportsubheader');
256    columnHeaderRow.appendChild(siteHeader);
257    columnHeaderRow.appendChild(startDateHeader); 
258   
259    if (viewType == 'MONTH') addMonthColumnHeaders(columnHeaderRow, startDate);
260    else if (viewType == 'WEEK') addWeekColumnHeaders(columnHeaderRow, startDate);
261    else if (viewType == 'QUARTER') addQuarterColumnHeaders(columnHeaderRow, startDate);
262    else if (viewType == 'YEAR') addYearSubHeaders(startDate, endDate, latestDate, columnHeaderRow, viewType);
263   
264   
265    columnHeaderRow.appendChild(getTableCellElement('Grand\ntotal', 'reportsubheader'));
266
267    // Build table     
268    reportTable.appendChild(headerRow);
269    reportTable.appendChild(subHeaderRowYear);
270    reportTable.appendChild(columnHeaderRow);
271         
272    // Data rows     
273    addDataRowsToTable(report, reportTable);
274     
275    // Add a row with the combined number of each month-column
276    var sitesCombinedRow = document.createElement('tr');
277    sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
278    sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary'));
279    var gt = 0;
280    for (key in sitesCombined)
281    {
282      sitesCombinedRow.appendChild(getTableCellElement(sitesCombined[key],'colsummary'));
283      gt += sitesCombined[key];
284    }
285    sitesCombinedRow.appendChild(getTableCellElement(gt, 'colsummary'));
286    reportTable.appendChild(sitesCombinedRow); 
287    return reportTable;
288  }
289 
290  function addQuarterColumnHeaders(columnHeaderRow, startDate)
291  {
292    var currentDate = startDate;
293    for (var i=0;i<numCols;i++)
294    {
295      var quarter = Math.floor(currentDate.getMonth()/3)+1;
296      var columnText = 'Q'+quarter;
297      var quarterHeader = getTableCellElement(columnText, 'reportsubheader');
298      columnHeaderRow.appendChild(quarterHeader); 
299      currentDate.setMonth(currentDate.getMonth()+3);     
300    }
301  }
302 
303  function addWeekColumnHeaders(columnHeaderRow, startDate)
304  {
305    var currentDate = startDate;
306    var day = currentDate.getDay()-1;
307    day = day>=0 ? day: day + 7;
308    currentDate.setDate(currentDate.getDate()-day);
309    for (var i=0;i<numCols;i++)
310    {     
311      var weekNum = getWeekByDate(currentDate);
312      var columnText = weekNum;
313      if (weekNum < 10) columnText = '0'+columnText;     
314      columnHeaderRow.appendChild(getTableCellElement(columnText, 'reportsubheader'));
315      currentDate.setDate(currentDate.getDate()+7);     
316    }
317  }
318 
319  function addMonthColumnHeaders(columnHeaderRow, startDate)
320  {   
321    var currentDate = new Date(startDate.getFullYear(), startDate.getMonth());
322    for (var i=0;i<numCols;i++)
323    {             
324      var monthHeader = getTableCellElement(month[currentDate.getMonth()], 'reportsubheader');
325      columnHeaderRow.appendChild(monthHeader);       
326      currentDate.setMonth(currentDate.getMonth() +1);
327    }   
328  }
329 
330  function addYearSubHeaders(startDate, endDate, latestDate, subHeaderRowYear, vt)
331  {   
332    var currentYear = startDate.getFullYear(); 
333   
334    var columnCounter = 0;   
335    do
336    {
337      var colspan;
338      var headerText = currentYear;
339      if (vt == "MONTH")
340      {
341        if (currentYear == startDate.getFullYear()) 
342          colspan =  (12-parseInt(startDate.getMonth()+1)+1);
343        else if (currentYear == endDate.getFullYear()) 
344          colspan = parseInt(endDate.getMonth()+1);
345        else
346          colspan = 12;
347      }
348      else if (vt == "WEEK")
349      { 
350        if (startDate.getFullYear() == endDate.getFullYear())
351        {
352          colspan = numCols;
353        }
354        else if (currentYear == startDate.getFullYear())
355        {
356          var startWeek = getWeekByDate(startDate);
357          var lastDay = new Date(startDate.getFullYear(), 11, 31);
358          var endWeek = getWeekByDate(lastDay);
359          if (endWeek == 1) endWeek = getWeekByDate(lastDay.setDate(lastDay.getDate()-7));
360          colspan = endWeek - startWeek +1;
361        }
362        else if (currentYear == endDate.getFullYear())
363        {
364          var endWeek = getWeekByDate(endDate);
365          colspan = endWeek;
366        }
367        else
368        {
369          var dateInLastWeek = new Date(currentYear, 11, 31);
370          var endWeek = getWeekByDate(dateInLastWeek);
371          if (endWeek == 1) endWeek = getWeekByDate(dateInLastWeek.setDate(dateInLastWeek.getDate()-7));
372          colspan = endWeek;
373        }               
374      }
375      else if (vt == "QUARTER")
376      {
377        if (currentYear == startDate.getFullYear())
378        {
379          if (startDate.getFullYear() == endDate.getFullYear())
380          {
381            colspan = Math.floor((endDate.getMonth()-startDate.getMonth())/3)+1;
382          }
383          else
384          {
385            colspan = Math.floor((11-startDate.getMonth())/3) +1;
386          }
387        }
388        else if(currentYear == endDate.getFullYear())
389        {
390          colspan = Math.floor(endDate.getMonth()/3)+1;
391        }
392        else 
393        {
394          colspan = 4;
395        }
396      }
397      else if (vt == "YEAR")
398      {
399        colspan = 1;       
400      }
401      columnCounter += colspan;           
402      subHeaderRowYear.appendChild(getTableCellElement(headerText, 'reportsubheader', colspan));
403    }while(!(++currentYear>endDate.getFullYear()));
404  }
405 
406  function addDataRowsToTable(report, reportTable)
407  {
408    var fdString = report.startDate;
409    var ldString = report.endDate;
410    var startDate = new Date();
411    startDate.setYear(fdString.substr(0,4));
412    startDate.setMonth(fdString.substr(4,2)-1);
413    startDate.setDate(fdString.substr(6));
414    var endDate = new Date();
415    endDate.setYear(ldString.substr(0,4));
416    endDate.setMonth(ldString.substr(4,2)-1);
417    endDate.setDate(ldString.substr(6));
418    var viewType = report.viewType;
419   
420    var sites = report.sites;
421    for (namePrefix in sites)
422    {
423      if (!sites.hasOwnProperty(namePrefix)) continue;       
424      var site = sites[namePrefix];
425      var siteName = site.name;       
426      var year = site.startdate.substr(0,4);
427      var month = site.startdate.substr(5,2);
428      var date = site.startdate.substr(8,2);     
429      var siteStartDate = new Date(year, month-1, date);
430     
431      var siteData = report[namePrefix];
432      var tableRow = document.createElement('tr');
433      var tableCol = getTableCellElement(siteName, 'rowtitle');
434      tableRow.appendChild(tableCol);
435      tableRow.appendChild(getTableCellElement(year+'-'+(month)+'-'+date, 'reportdata'));
436      var currentDate = new Date(startDate.getFullYear(), startDate.getMonth(), startDate.getDate());     
437      var grandTotal = 0;
438      var columnCounter = 0;
439      do
440      {
441        var data = 0;
442        var keyIndex;
443        var yearIndex = currentDate.getFullYear();
444       
445        if (viewType == 'YEAR')
446        {
447          keyIndex = yearIndex;
448          if (siteData != null)
449          {
450            if (siteData[keyIndex] != null) data = siteData[keyIndex];
451          }
452          grandTotal += data;         
453          if (currentDate.getFullYear() < siteStartDate.getFullYear()) data = '';
454          else if (sitesCombined[keyIndex] == null) sitesCombined[keyIndex] = data;
455          else sitesCombined[keyIndex] += data;
456          currentDate.setFullYear(currentDate.getFullYear()+1);
457        }
458        else if (viewType == 'QUARTER')
459        {
460          var qIndex = Math.floor(currentDate.getMonth()/3) + 1;
461          var startQuarter = Math.floor(siteStartDate.getMonth()/3)+1;
462          keyIndex = yearIndex + '' + qIndex;
463          if (siteData != null)
464          {
465            if (siteData[keyIndex] != null) data = siteData[keyIndex];           
466          }         
467          grandTotal += data;
468          if ( currentDate.getFullYear() <= siteStartDate.getFullYear() && qIndex<startQuarter)
469          {
470            data = '';
471            sitesCombined[keyIndex] = 0;
472          }
473          else if (sitesCombined[keyIndex] == null) sitesCombined[keyIndex] = data;
474          else sitesCombined[keyIndex] += data;
475          currentDate.setMonth(currentDate.getMonth()+3);         
476        }
477        else if (viewType == 'MONTH')
478        {
479          var monthIndex = currentDate.getMonth()+1;
480          var rowFill = monthIndex < 10 ? '0' : '';
481          keyIndex = yearIndex + rowFill + monthIndex;
482          if (siteData != null)
483          {
484            if (siteData[keyIndex] != null) data = siteData[keyIndex];
485          }
486          grandTotal += data;         
487          if (currentDate.getFullYear() <= siteStartDate.getFullYear() && (monthIndex-1) < siteStartDate.getMonth())
488          {
489            data = '';           
490          }
491          else if (sitesCombined[keyIndex] == null) sitesCombined[keyIndex] = data;
492          else sitesCombined[keyIndex] += data;
493         
494          currentDate.setMonth(currentDate.getMonth()+1);
495        }
496        else if (viewType == 'WEEK')
497        {
498          var weekIndex = getWeekByDate(currentDate);
499          keyIndex = yearIndex + '' + weekIndex;
500          if (siteData != null)
501          {
502            if (siteData[keyIndex] != null) data = siteData[keyIndex];
503          }
504          grandTotal += data;         
505          if (currentDate.getFullYear() <= siteStartDate.getFullYear() && getWeekByDate(currentDate) < getWeekByDate(siteStartDate))
506          {
507            data = '';
508          }
509          else if (sitesCombined[keyIndex] == null) sitesCombined[keyIndex] = data;
510          else sitesCombined[keyIndex] += data;
511          currentDate.setDate(currentDate.getDate()+7);
512        }
513       
514        tableRow.appendChild(getTableCellElement(data, 'reportdata'));
515        columnCounter++;       
516      }while (columnCounter< numCols)     
517      tableRow.appendChild(getTableCellElement(grandTotal, 'rowsummary'));
518      reportTable.appendChild(tableRow);
519    }
520  }
521 
522  function getReportTable()
523  {
524      var reportTable = document.createElement('table');
525      reportTable.setAttribute('class','reporttable');
526      reportTable.setAttribute('border','1');     
527      return reportTable;
528  }
529 
530  function getTableCellElement(text, clazz, colspan, rowspan)
531  {
532    var cellElement = document.createElement('td');
533    text = new String(text);   
534    var textArray = text.split("\n");   
535    if (textArray.length > 1)
536    {
537      for (var i=0;i<textArray.length;i++)
538      {       
539        if (i>0)cellElement.appendChild(document.createElement('br'));
540        cellElement.appendChild(document.createTextNode(textArray[i]));
541      }     
542    }
543    else
544    {
545      cellElement.appendChild(document.createTextNode(text));
546    }
547    cellElement.setAttribute('class', clazz);
548    if (colspan != null) cellElement.setAttribute('colspan', colspan);
549    if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
550   
551    return cellElement;
552  }
553  </script>
554 
555 
556  </base:head>
557  <base:body onload="init()">
558    <p:path style="margin-top: 20px; margin-bottom: 10px;">
559      <p:pathelement title="Reggie" href="<%="index.jsp?ID="+ID%>" />
560      <p:pathelement title="Report generator" />
561    </p:path>
562   
563    <%
564    if (sc.getActiveProjectId() == 0)
565    {
566      %>
567      <base:note type="warning" style="width: 800px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
568        No project has been selected. You may proceed with the report generation but
569        only your own items will be included in the report.
570      </base:note>
571      <%
572    }
573    %>
574 
575    <form name="reggie" onsubmit="return false;">
576      <!-- 1. Report type-->
577      <table border="0" cellspacing="0" cellpadding="0" class="stepform">
578      <tr>
579        <td rowspan="3" class="stepno">1</td>
580        <td class="steptitle">Report type</td>
581      </tr>
582      <tr>
583        <td class="stepfields">
584          <table border="0" cellspacing="0" cellpadding="0" width="100%">
585          <tr valign="top">
586            <td class="prompt">Report</td>
587            <td class="input">
588              <select name="reporttype">
589                <option value="samplecount">Sample count report</option>
590              </select>
591            </td>
592            <td class="status" id="report.status"></td>
593            <td class="help">
594              <span id="report.message" class="message" style="display: none;"></span>
595              Select which report to generate.
596            </td>
597          </tr>
598          </table>
599        </td>
600      </tr>
601      </table>
602     
603      <div id="sampleCountSection" style="display:none;">
604        <p></p>
605        <!-- 2. Report parameters-->
606        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
607        <tr>
608          <td rowspan="3" class="stepno">2</td>
609          <td class="steptitle">Report parameters</td>
610        </tr>
611        <tr>
612          <td class="stepfields">
613            <table border="0" cellspacing="0" cellpadding="0" width="100%">           
614            <tr>
615              <td valign="top" class="prompt">Report period</td>
616              <td valign="top" class="input">
617                From<input type="text" onChange="dateOnChange()" size=7 name="fromdate"/>&nbsp;
618                To<input type="text" onChange="dateOnChange()" size=7 name="todate" />
619              </td>
620              <td valign="top" class="status" id="displayInterval.status"></td>
621              <td class="help">
622                <span id="displayInterval.message" class="message" style="display: none;"></span>
623                Define which period the report should cover. Empty fields will include all tubes.<br>
624                The report will adjust itself depending on the size of the period.
625                <ul>
626                  <li>Period shorter then 3 months - specimens per week</li>
627                  <li>Period shorter then 13 months - specimens per month</li>
628                  <li>Period shorter then 3 year - specimens per quarter</li>
629                  <li>Period is 3 year or greater - specimens per year</li>
630                </ul>                 
631              </td>
632            </tr>           
633            </table>
634          </td>
635        </tr>
636        </table>
637      </div>
638     
639      <div id="reportSection" style="display:none;">
640        <p></p>
641        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
642        <tr>
643          <td rowspan="3" class="stepno">3</td>
644          <td class="steptitle">Generated report</td>
645        </tr>
646        <tr>
647          <td id="reportcell" class="stepfields">
648          </td>
649        </tr>
650        </table>
651      </div> 
652     
653      <div class="error" id="errorMessage" style="display: none; width: 800px; margin-left: 20px; margin-bottom: 0px;"></div>   
654       
655      <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
656        <tr>
657          <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
658          <td><base:button id="gonext" title="Next" image="gonext.gif" onclick="goNext(true)" /></td>
659          <td><base:button id="gocreate" title="Generate" image="gonext.gif" onclick="goCreate()" style="display: none;"/></td>         
660          <td><base:button id="gorestart" title="Restart" image="goback.gif" onclick="goRestart(true)" style="display: none;"/></td>
661          <td id="gonext.message" class="message"></td>
662        </tr>
663      </table>     
664    </form>
665  </base:body>
666  </base:page>
667  <%
668}
669finally
670{
671  if (dc != null) dc.close();
672}
673%>
Note: See TracBrowser for help on using the repository browser.