source: extensions/net.sf.basedb.reggie/branches/ticket-422/resources/samplereportgenerator.jsp @ 1757

Last change on this file since 1757 was 1757, checked in by Nicklas Nordborg, 9 years ago

Catching up on trunk revisions 1734 to 1756.

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