extensions/net.sf.basedb.meludi/trunk/resources/reports/samplereportgenerator.js

Code
Comments
Other
Rev Date Author Line
2933 14 Nov 14 olle 1 var Report = function()
2933 14 Nov 14 olle 2 {
2933 14 Nov 14 olle 3   var report = {};
2933 14 Nov 14 olle 4   var debug = 0;
2933 14 Nov 14 olle 5   
2933 14 Nov 14 olle 6   var periodIsValid = true;
2933 14 Nov 14 olle 7   
3210 26 Mar 15 olle 8   report.TITLE = 'MeLuDI';
6805 24 Aug 22 olle 9   report.VERSION = '1.6.0';
2933 14 Nov 14 olle 10
2933 14 Nov 14 olle 11   report.initPage = function()
2933 14 Nov 14 olle 12   {
2933 14 Nov 14 olle 13     var frm = document.forms['meludi'];
2933 14 Nov 14 olle 14
2933 14 Nov 14 olle 15     // Step 1
2933 14 Nov 14 olle 16
2933 14 Nov 14 olle 17     // Step 2
2933 14 Nov 14 olle 18     Events.addEventHandler('step-2', 'wizard-initialize', report.initializeStep2);
2933 14 Nov 14 olle 19     Events.addEventHandler('step-2', 'wizard-validate', report.validateStep2);
2933 14 Nov 14 olle 20     Events.addEventHandler('fromdate', 'blur', report.dateOnChange)
2933 14 Nov 14 olle 21     Events.addEventHandler('todate', 'blur', report.dateOnChange)
2933 14 Nov 14 olle 22     
2933 14 Nov 14 olle 23     // Final registration
2933 14 Nov 14 olle 24     Events.addEventHandler('wizard', 'wizard-submit', report.submit);
2933 14 Nov 14 olle 25     Events.addEventHandler('printButton', 'click', report.printVersion);
2933 14 Nov 14 olle 26
2933 14 Nov 14 olle 27     // Navigation
2933 14 Nov 14 olle 28     Buttons.addClickHandler('gocancel', Wizard.restartWizard);
2933 14 Nov 14 olle 29     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2933 14 Nov 14 olle 30     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2933 14 Nov 14 olle 31     Buttons.addClickHandler('gocreate', Wizard.goRegister);
2933 14 Nov 14 olle 32
2933 14 Nov 14 olle 33     Doc.show('step-1');
2933 14 Nov 14 olle 34     Doc.show('gonext');
2933 14 Nov 14 olle 35   }
2933 14 Nov 14 olle 36   
2933 14 Nov 14 olle 37   report.initializeStep2 = function()
2933 14 Nov 14 olle 38   {
2933 14 Nov 14 olle 39     var frm = document.forms['meludi'];
2933 14 Nov 14 olle 40     Wizard.setCurrentStep(2);
2933 14 Nov 14 olle 41     Doc.show('gocancel');
2933 14 Nov 14 olle 42     Doc.show('gocreate');
2933 14 Nov 14 olle 43     var reportType = frm.reporttype.value;
2933 14 Nov 14 olle 44     
2933 14 Nov 14 olle 45     // Hide all parameter fields
2933 14 Nov 14 olle 46     Doc.hide('report-period');
2933 14 Nov 14 olle 47     Doc.hide('view-type');
2933 14 Nov 14 olle 48     Doc.hide('projectfocus-filter');
2933 14 Nov 14 olle 49
2933 14 Nov 14 olle 50     // Re-enable base on report type
2933 14 Nov 14 olle 51     if (reportType == 'samplecount')
2933 14 Nov 14 olle 52     {
2933 14 Nov 14 olle 53       Doc.show('report-period');
2933 14 Nov 14 olle 54       Doc.show('view-type');
2933 14 Nov 14 olle 55       Doc.show('projectfocus-filter');
2933 14 Nov 14 olle 56     }
2933 14 Nov 14 olle 57     else if (reportType == 'patientcount')
2933 14 Nov 14 olle 58     {
2933 14 Nov 14 olle 59       Doc.show('report-period');
2933 14 Nov 14 olle 60       Doc.show('view-type');
2933 14 Nov 14 olle 61     }
2933 14 Nov 14 olle 62     else if (reportType == 'overviewreport')
2933 14 Nov 14 olle 63     {
2933 14 Nov 14 olle 64       Doc.show('report-period');
2933 14 Nov 14 olle 65       Doc.show('projectfocus-filter');
2933 14 Nov 14 olle 66     }
2933 14 Nov 14 olle 67     else if (reportType == 'missingsampledatareport')
2933 14 Nov 14 olle 68     {
2933 14 Nov 14 olle 69 /*
2933 14 Nov 14 olle 70       Doc.show('sample-type');
2933 14 Nov 14 olle 71 */
2933 14 Nov 14 olle 72       Doc.show('projectfocus-filter');
2933 14 Nov 14 olle 73     }
2933 14 Nov 14 olle 74
2933 14 Nov 14 olle 75     frm.fromdate.focus();
2933 14 Nov 14 olle 76   }
2933 14 Nov 14 olle 77   
2933 14 Nov 14 olle 78   report.validateStep2 = function(event)
2933 14 Nov 14 olle 79   {
2933 14 Nov 14 olle 80     if (!periodIsValid) event.preventDefault();
2933 14 Nov 14 olle 81   }
2933 14 Nov 14 olle 82
2933 14 Nov 14 olle 83   report.dateOnChange = function()
2933 14 Nov 14 olle 84   {
2933 14 Nov 14 olle 85     var frm = document.forms['meludi'];    
2933 14 Nov 14 olle 86     var fromDate = frm.fromdate.value;
2933 14 Nov 14 olle 87     var toDate = frm.todate.value;
2933 14 Nov 14 olle 88     
2933 14 Nov 14 olle 89     periodIsValid = false;
2933 14 Nov 14 olle 90     Wizard.setInputStatus('period');
2933 14 Nov 14 olle 91
2933 14 Nov 14 olle 92     if (fromDate != '')
2933 14 Nov 14 olle 93     {
2933 14 Nov 14 olle 94       fromDate = Meludi.autoFillDate(fromDate, true);
2933 14 Nov 14 olle 95       frm.fromdate.value = fromDate;      
2933 14 Nov 14 olle 96       if (!Dates.isDate(fromDate, 'yyyyMMdd'))
2933 14 Nov 14 olle 97       {
2933 14 Nov 14 olle 98         Wizard.setInputStatus('period', 'invalid', 'Not a valid from-date');
2933 14 Nov 14 olle 99         return;
2933 14 Nov 14 olle 100       }
2933 14 Nov 14 olle 101     }
2933 14 Nov 14 olle 102
2933 14 Nov 14 olle 103     if (toDate != '')
2933 14 Nov 14 olle 104     {
2933 14 Nov 14 olle 105       toDate = Meludi.autoFillDate(toDate, true);
2933 14 Nov 14 olle 106       frm.todate.value = toDate;      
2933 14 Nov 14 olle 107       if (!Dates.isDate(toDate, 'yyyyMMdd'))
2933 14 Nov 14 olle 108       {
2933 14 Nov 14 olle 109         Wizard.setInputStatus('period', 'invalid', 'Not a valid to-date');
2933 14 Nov 14 olle 110         return;
2933 14 Nov 14 olle 111       }
2933 14 Nov 14 olle 112     }
2933 14 Nov 14 olle 113     
2933 14 Nov 14 olle 114     if (toDate && fromDate)
2933 14 Nov 14 olle 115     {
2933 14 Nov 14 olle 116       if (fromDate > toDate)
2933 14 Nov 14 olle 117       {
2933 14 Nov 14 olle 118         Wizard.setInputStatus('period', 'invalid', 'Invalid period')
2933 14 Nov 14 olle 119         return;
2933 14 Nov 14 olle 120       }      
2933 14 Nov 14 olle 121     }
2933 14 Nov 14 olle 122     
2933 14 Nov 14 olle 123     Wizard.setInputStatus('period', 'valid');
2933 14 Nov 14 olle 124     periodIsValid = true;
2933 14 Nov 14 olle 125   }
2933 14 Nov 14 olle 126   
2933 14 Nov 14 olle 127   report.submit = function()
2933 14 Nov 14 olle 128   {
2933 14 Nov 14 olle 129     var frm = document.forms['meludi'];    
2933 14 Nov 14 olle 130
2933 14 Nov 14 olle 131     var url = '../SampleReport.servlet?ID='+App.getSessionId();
2933 14 Nov 14 olle 132     url += '&cmd='+frm.reporttype.value;
2933 14 Nov 14 olle 133     url += '&fdate='+frm.fromdate.value;
2933 14 Nov 14 olle 134     url += '&tdate='+frm.todate.value;
2933 14 Nov 14 olle 135     url += '&vtype='+frm.viewtype.value;
2933 14 Nov 14 olle 136     url += '&projectfocusfilter='+frm.projectfocusfilter.value;
2933 14 Nov 14 olle 137
2933 14 Nov 14 olle 138     Wizard.showLoadingAnimation('Generating report...');
2933 14 Nov 14 olle 139     Wizard.asyncJsonRequest(url, report.onReportGenerated);
2933 14 Nov 14 olle 140   }
2933 14 Nov 14 olle 141   
2933 14 Nov 14 olle 142   report.onReportGenerated = function(response)
2933 14 Nov 14 olle 143   {
2933 14 Nov 14 olle 144     var reportData = response.report;
2933 14 Nov 14 olle 145     var permissionDeniedForPatientName = reportData.permissionDeniedForPatientName;
2933 14 Nov 14 olle 146     var permissionDeniedForPad = reportData.permissionDeniedForPad;
2933 14 Nov 14 olle 147   
2933 14 Nov 14 olle 148     var reportTable;
2933 14 Nov 14 olle 149     var frm = document.forms['meludi'];    
2933 14 Nov 14 olle 150     var reportType = frm.reporttype.value;
2933 14 Nov 14 olle 151   
2933 14 Nov 14 olle 152     if (reportData != null)
2933 14 Nov 14 olle 153     {
2933 14 Nov 14 olle 154       if ('samplecount' == reportType)
2933 14 Nov 14 olle 155       {
2933 14 Nov 14 olle 156         reportTable = createItemCountReport(reportData, reportType);
2933 14 Nov 14 olle 157       }
2933 14 Nov 14 olle 158       else if ('patientcount' == reportType)
2933 14 Nov 14 olle 159       {
2933 14 Nov 14 olle 160         reportTable = createItemCountReport(reportData, reportType);
2933 14 Nov 14 olle 161       }
2933 14 Nov 14 olle 162       else if ('overviewreport' == reportType)
2933 14 Nov 14 olle 163       {
2933 14 Nov 14 olle 164         reportTable = createOverviewReport(reportData);
2933 14 Nov 14 olle 165       }
2933 14 Nov 14 olle 166       else if ('missingsampledatareport' == reportType)
2933 14 Nov 14 olle 167       {
2933 14 Nov 14 olle 168         reportTable = createMissingSampleDataReport(reportData);
2933 14 Nov 14 olle 169       }
2933 14 Nov 14 olle 170     }
2933 14 Nov 14 olle 171     else
2933 14 Nov 14 olle 172     {
2933 14 Nov 14 olle 173       Wizard.setFatalError('No values could be found during given period');
2933 14 Nov 14 olle 174       return;
2933 14 Nov 14 olle 175     }
2933 14 Nov 14 olle 176
2933 14 Nov 14 olle 177     var reportDiv = Doc.element('reportdiv');
2933 14 Nov 14 olle 178     reportDiv.appendChild(reportTable);
2933 14 Nov 14 olle 179     
2933 14 Nov 14 olle 180     // Optional extra tables
2933 14 Nov 14 olle 181     if ('overviewreport' == reportType)
2933 14 Nov 14 olle 182     {
2933 14 Nov 14 olle 183       var spacer0 = document.createElement('text');
2933 14 Nov 14 olle 184       spacer0.innerHTML = "<BR>";
2933 14 Nov 14 olle 185       reportDiv.appendChild(spacer0);
2933 14 Nov 14 olle 186       var spacer = document.createElement('text');
2933 14 Nov 14 olle 187       spacer.innerHTML = "<BR>";
2933 14 Nov 14 olle 188       reportDiv.appendChild(spacer);
2933 14 Nov 14 olle 189       // Table with patients having at least one item of different sample types
2933 14 Nov 14 olle 190       reportDiv.appendChild(spacer);
2933 14 Nov 14 olle 191       var patientWithSampleTable = createOverviewPatientWithSampleTable(reportData);
2933 14 Nov 14 olle 192       reportDiv.appendChild(patientWithSampleTable);
2933 14 Nov 14 olle 193       // Table with patients having different combinations of sample types
2933 14 Nov 14 olle 194       reportDiv.appendChild(spacer);
2933 14 Nov 14 olle 195     }
2933 14 Nov 14 olle 196     // Summary list
2933 14 Nov 14 olle 197     var summaryList = document.createElement('ul');
2933 14 Nov 14 olle 198     if (unknownSite == null) unknownSite = 0;
2933 14 Nov 14 olle 199     if (unknownPatientSite == null) unknownPatientSite = 0;
2933 14 Nov 14 olle 200     if (unknownCreation == null) unknownCreation = 0;
2933 14 Nov 14 olle 201     if ('samplecount' == reportType)
2933 14 Nov 14 olle 202     {
2933 14 Nov 14 olle 203       var samples = 'specimens';
2933 14 Nov 14 olle 204       summaryList.appendChild(getListElement(unknownSite + ' ' + samples + ' registered to unknown sites.'));
2933 14 Nov 14 olle 205       summaryList.appendChild(getListElement(unknownCreation + ' ' + samples + ' without creation date. These are included in the \'Total\' column.'));
2933 14 Nov 14 olle 206     }
2933 14 Nov 14 olle 207     else if ('patientcount' == reportType)
2933 14 Nov 14 olle 208     {
2933 14 Nov 14 olle 209       summaryList.appendChild(getListElement(unknownSite + ' patients registered to unknown sites.'));
2933 14 Nov 14 olle 210       summaryList.appendChild(getListElement(unknownCreation + ' patients without creation date. These are included in the \'Total\' column.'));
2933 14 Nov 14 olle 211     }
2933 14 Nov 14 olle 212     else if ('overviewreport' == reportType)
2933 14 Nov 14 olle 213     {
2933 14 Nov 14 olle 214       var numSpecimenNoDate = 0;
2933 14 Nov 14 olle 215       if (report != null)
2933 14 Nov 14 olle 216       {
2933 14 Nov 14 olle 217         var statistics = reportData.statistics;
2933 14 Nov 14 olle 218         numSpecimenNoDate = statistics.specimenNoDate;
2933 14 Nov 14 olle 219       }
2933 14 Nov 14 olle 220       if (numSpecimenNoDate == null)
2933 14 Nov 14 olle 221       {
2933 14 Nov 14 olle 222         numSpecimenNoDate = 0;
2933 14 Nov 14 olle 223       }
2933 14 Nov 14 olle 224       summaryList.appendChild(getListElement(unknownPatientSite + ' patients registered to unknown sites.'));
2933 14 Nov 14 olle 225       summaryList.appendChild(getListElement(numPatientsNoSamples + ' patients with no samples.'));
2933 14 Nov 14 olle 226       summaryList.appendChild(getListElement('Note: Time period filter only affects sample items, patients are derived from these.'));
2933 14 Nov 14 olle 227       summaryList.appendChild(getListElement('Note: If creation date is unknown, registration date is used instead.'));
2933 14 Nov 14 olle 228       summaryList.appendChild(getListElement('Items with unknown creation date: Specimen ' + numSpecimenNoDate));
2933 14 Nov 14 olle 229     }
2933 14 Nov 14 olle 230     else if ('missingsampledatareport' == reportType)
2933 14 Nov 14 olle 231     {
2933 14 Nov 14 olle 232       summaryList.appendChild(getListElement('Note: Patient name is considered missing if either "all first names" or "family name" is missing for an existing patient.'));
2933 14 Nov 14 olle 233       if (permissionDeniedForPatientName)
2933 14 Nov 14 olle 234       {
2933 14 Nov 14 olle 235         var patientNamePermissionWarning = document.createElement('li');
2933 14 Nov 14 olle 236         patientNamePermissionWarning.innerHTML = 'Sorry, logged-in user does not have permission to check patient names.';
2933 14 Nov 14 olle 237         summaryList.appendChild(patientNamePermissionWarning);
2933 14 Nov 14 olle 238       }
2933 14 Nov 14 olle 239       if (permissionDeniedForPad)
2933 14 Nov 14 olle 240       {
2933 14 Nov 14 olle 241         var padPermissionWarning = document.createElement('li');
2933 14 Nov 14 olle 242         padPermissionWarning.innerHTML = 'Sorry, logged-in user does not have permission to check PAD values.';
2933 14 Nov 14 olle 243         summaryList.appendChild(padPermissionWarning);
2933 14 Nov 14 olle 244       }
2933 14 Nov 14 olle 245     }
2933 14 Nov 14 olle 246     reportDiv.appendChild(summaryList);
2933 14 Nov 14 olle 247     if ('consentcount' == reportType)
2933 14 Nov 14 olle 248     {
2933 14 Nov 14 olle 249       // Add table with patients with consents with multiple dates
2933 14 Nov 14 olle 250       var multipleDatesTable = createConsentTablePatientsWithMultipleDates(reportData);
2933 14 Nov 14 olle 251       reportDiv.appendChild(multipleDatesTable);
2933 14 Nov 14 olle 252     }
2933 14 Nov 14 olle 253     
2933 14 Nov 14 olle 254     Doc.show('step-3');
2933 14 Nov 14 olle 255     Doc.show('gorestart');
2933 14 Nov 14 olle 256   }
2933 14 Nov 14 olle 257
2933 14 Nov 14 olle 258   
2933 14 Nov 14 olle 259   report.printVersion = function()
2933 14 Nov 14 olle 260   {
2933 14 Nov 14 olle 261     var frm = document.forms['meludi'];
2933 14 Nov 14 olle 262     var reportName = frm.reporttype[frm.reporttype.selectedIndex].text;
2933 14 Nov 14 olle 263     var printNote = '<b>Note!</b> For better printing set page orientation to <i>landscape</i>.';
2933 14 Nov 14 olle 264     Meludi.openPrintWindow('step-3-content', reportName, 'landscape', printNote, '../', 'report.css');
2933 14 Nov 14 olle 265   }
2933 14 Nov 14 olle 266
2933 14 Nov 14 olle 267   return report;
2933 14 Nov 14 olle 268 }();
2933 14 Nov 14 olle 269
2933 14 Nov 14 olle 270 Doc.onLoad(Report.initPage);
2933 14 Nov 14 olle 271
2933 14 Nov 14 olle 272
2933 14 Nov 14 olle 273 var numCols;
2933 14 Nov 14 olle 274 var unknownSite = 0;
2933 14 Nov 14 olle 275 var unknownPatientSite = 0;
2933 14 Nov 14 olle 276 var unknownCreation = 0;
2933 14 Nov 14 olle 277 var numMissing = 0;
2933 14 Nov 14 olle 278 var numPatientsNoSamples = 0;
2933 14 Nov 14 olle 279
2933 14 Nov 14 olle 280 var month=new Array(12);
2933 14 Nov 14 olle 281   month[0]="Jan";
2933 14 Nov 14 olle 282   month[1]="Feb";
2933 14 Nov 14 olle 283   month[2]="Mar";
2933 14 Nov 14 olle 284   month[3]="Apr";
2933 14 Nov 14 olle 285   month[4]="May";
2933 14 Nov 14 olle 286   month[5]="Jun";
2933 14 Nov 14 olle 287   month[6]="Jul";
2933 14 Nov 14 olle 288   month[7]="Aug";
2933 14 Nov 14 olle 289   month[8]="Sep";
2933 14 Nov 14 olle 290   month[9]="Oct";
2933 14 Nov 14 olle 291   month[10]="Nov";
2933 14 Nov 14 olle 292   month[11]="Dec";
2933 14 Nov 14 olle 293
2933 14 Nov 14 olle 294 function createMissingDataSampleListPreview(allLines, sampleTypes, previewTitle, previewList)
2933 14 Nov 14 olle 295 {
2933 14 Nov 14 olle 296   var numCases = allLines.length - 2; // First line is a header line
2933 14 Nov 14 olle 297   var numSpecimen = 0;
2933 14 Nov 14 olle 298   var numNoSpecimen = 0;
2933 14 Nov 14 olle 299     
2933 14 Nov 14 olle 300   var html = '<tr><th>'+allLines[0].replace(/\t/g, '</th><th>')+'</th></tr>';
2933 14 Nov 14 olle 301   // Check second column for the 'Subtype' value
2933 14 Nov 14 olle 302   var numNoConsent = 0;
2933 14 Nov 14 olle 303   var numMissingConsent = 0;
2933 14 Nov 14 olle 304   for (var i = 1 ; i <= numCases; i++)
2933 14 Nov 14 olle 305   {
2933 14 Nov 14 olle 306     var line = allLines[i];
2933 14 Nov 14 olle 307     var cols = line.split(/\t/);
2933 14 Nov 14 olle 308     var sampleSubtype = cols[1];
2933 14 Nov 14 olle 309     if (sampleSubtype == 'Specimen')
2933 14 Nov 14 olle 310     {
2933 14 Nov 14 olle 311       numSpecimen++;
2933 14 Nov 14 olle 312     }
2933 14 Nov 14 olle 313     else if (sampleSubtype == 'NoSpecimen')
2933 14 Nov 14 olle 314     {
2933 14 Nov 14 olle 315       numNoSpecimen++;
2933 14 Nov 14 olle 316     }
2933 14 Nov 14 olle 317     var rowClass = '';
2933 14 Nov 14 olle 318     html += '<tr class="'+rowClass+'"><td>'+cols.join('</td><td>')+'</td></tr>';
2933 14 Nov 14 olle 319   }
2933 14 Nov 14 olle 320
2933 14 Nov 14 olle 321   previewTitle.innerHTML = 'Sample type(s) - ' + sampleTypes + ' (' + numCases + ')';
2933 14 Nov 14 olle 322   if (sampleTypes == 'Specimen' || sampleTypes == 'No specimen')
2933 14 Nov 14 olle 323   {
2933 14 Nov 14 olle 324     // Report the number of each subtype for 'Specimen/No specimen'
2933 14 Nov 14 olle 325     previewTitle.innerHTML = 'Sample type(s) - Specimen (' + numSpecimen + ')/No specimen (' + numNoSpecimen + ') Total (' + numCases + ')';
2933 14 Nov 14 olle 326   }
2933 14 Nov 14 olle 327   previewList.innerHTML = '<table>'+html+'</table>';
2933 14 Nov 14 olle 328   Doc.show('previewWrapper');
2933 14 Nov 14 olle 329 }
2933 14 Nov 14 olle 330
2933 14 Nov 14 olle 331 function createItemCountReport(report, reportType)
2933 14 Nov 14 olle 332 {
2933 14 Nov 14 olle 333   var reportTable = getReportTable();
4174 24 Oct 16 olle 334   var projectName = report.projectName;
2933 14 Nov 14 olle 335   var sdString = report.beginDate;
2933 14 Nov 14 olle 336   var edString = report.endDate;
2933 14 Nov 14 olle 337   var psdString = report.periodBeginDate;
2933 14 Nov 14 olle 338   var ldString = report.latestDate;
2933 14 Nov 14 olle 339   var startDate = dateStrToDate(sdString);
2933 14 Nov 14 olle 340   var endDate = dateStrToDate(edString);
2933 14 Nov 14 olle 341   var periodStartDate = dateStrToDate(psdString);
2933 14 Nov 14 olle 342   var latestDate = dateStrToDate(ldString);
2933 14 Nov 14 olle 343   
2933 14 Nov 14 olle 344   var viewType = report.viewType;
2933 14 Nov 14 olle 345   var projectFocusFilter = report.projectFocusFilter;
2933 14 Nov 14 olle 346   
2933 14 Nov 14 olle 347   var headerRow = document.createElement('tr');    
2933 14 Nov 14 olle 348   var subHeaderRowYear = document.createElement('tr');
2933 14 Nov 14 olle 349   var columnHeaderRow = document.createElement('tr');
2933 14 Nov 14 olle 350
2933 14 Nov 14 olle 351   var headerText = '# Items by ';
2933 14 Nov 14 olle 352   var startDateStr = addHyphensToDateString(sdString);
2933 14 Nov 14 olle 353   var endDateStr = addHyphensToDateString(edString);
2933 14 Nov 14 olle 354   var latestDateStr = addHyphensToDateString(ldString);
2933 14 Nov 14 olle 355   if ('samplecount' == reportType)
2933 14 Nov 14 olle 356   {
2933 14 Nov 14 olle 357     headerText = '# Specimens by ';
2933 14 Nov 14 olle 358     if (projectFocusFilter != null && projectFocusFilter != 'none')
2933 14 Nov 14 olle 359     {
2933 14 Nov 14 olle 360       projectFocusFilterDisplayText = getProjectFocusFilterDisplayText(projectFocusFilter);
2933 14 Nov 14 olle 361       headerText = '# Specimens with project focus \'' + projectFocusFilterDisplayText + '\' by ';
2933 14 Nov 14 olle 362     }
2933 14 Nov 14 olle 363   }
2933 14 Nov 14 olle 364   else if ('patientcount' == reportType)
2933 14 Nov 14 olle 365   {
2933 14 Nov 14 olle 366     headerText = '# Patients by ';
2933 14 Nov 14 olle 367   }
2933 14 Nov 14 olle 368   if (viewType == 'WEEK')
2933 14 Nov 14 olle 369   {  
2933 14 Nov 14 olle 370     var startWeek = getISOWeekNumber(periodStartDate);
2933 14 Nov 14 olle 371     var endWeek = getISOWeekNumber(endDate);
2933 14 Nov 14 olle 372     var tempDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate()-periodStartDate.getDay()+1);
2933 14 Nov 14 olle 373     numCols = 0;
2933 14 Nov 14 olle 374     while (tempDate < endDate)
2933 14 Nov 14 olle 375     {
2933 14 Nov 14 olle 376       numCols++;
2933 14 Nov 14 olle 377       tempDate.setDate(tempDate.getDate()+7);
2933 14 Nov 14 olle 378     }
2933 14 Nov 14 olle 379     headerText += 'week';
2933 14 Nov 14 olle 380   }
2933 14 Nov 14 olle 381   else if (viewType == 'MONTH')
2933 14 Nov 14 olle 382   {
2933 14 Nov 14 olle 383     numCols = (endDate.getFullYear()-periodStartDate.getFullYear())*12 + endDate.getMonth()-periodStartDate.getMonth()+1;
2933 14 Nov 14 olle 384     headerText += 'month';
2933 14 Nov 14 olle 385   }
2933 14 Nov 14 olle 386   else if (viewType == 'QUARTER')
2933 14 Nov 14 olle 387   {
2933 14 Nov 14 olle 388     // First year (from start quarter to end of year)
2933 14 Nov 14 olle 389     numCols = 4 - Math.floor(periodStartDate.getMonth()/3);
2933 14 Nov 14 olle 390     // Last year (from start of year to end quarter) 
2933 14 Nov 14 olle 391     numCols += Math.floor(endDate.getMonth()/3)+1;
2933 14 Nov 14 olle 392     // If first and last year is the same, subtract 4 quarters
2933 14 Nov 14 olle 393     if (endDate.getFullYear() - periodStartDate.getFullYear() == 0)
2933 14 Nov 14 olle 394     {
2933 14 Nov 14 olle 395       numCols -= 4;
2933 14 Nov 14 olle 396     }
2933 14 Nov 14 olle 397     // Full years between start and end dates
2933 14 Nov 14 olle 398     if((endDate.getFullYear() - periodStartDate.getFullYear()) > 1)
2933 14 Nov 14 olle 399     {
2933 14 Nov 14 olle 400       numCols += 4 * (endDate.getFullYear() - periodStartDate.getFullYear()-1);
2933 14 Nov 14 olle 401     }
2933 14 Nov 14 olle 402     headerText += 'quarter';
2933 14 Nov 14 olle 403   }
2933 14 Nov 14 olle 404   else
2933 14 Nov 14 olle 405   {
2933 14 Nov 14 olle 406     numCols = endDate.getFullYear() - periodStartDate.getFullYear() + 1;
2933 14 Nov 14 olle 407     headerText += 'year';
2933 14 Nov 14 olle 408   }
2933 14 Nov 14 olle 409     
2933 14 Nov 14 olle 410   // Set table header
2933 14 Nov 14 olle 411   headerText += ' (between ' + startDateStr + ' and ' + endDateStr + ')';
2933 14 Nov 14 olle 412   if (latestDate != null)
2933 14 Nov 14 olle 413   {
2933 14 Nov 14 olle 414     headerText += '\nLast registration ' + latestDateStr;
2933 14 Nov 14 olle 415   }
2933 14 Nov 14 olle 416   // Add top header line with program title and version  
4174 24 Oct 16 olle 417   headerText = projectName + ' [' + Report.TITLE + ' ' + Report.VERSION + ']\n' + headerText;  
2933 14 Nov 14 olle 418   headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+5)));
2933 14 Nov 14 olle 419   
2933 14 Nov 14 olle 420   // Sub headers
2933 14 Nov 14 olle 421   // Only if each datacol is less then a year
2933 14 Nov 14 olle 422   if (viewType != 'YEAR')
2933 14 Nov 14 olle 423   {
2933 14 Nov 14 olle 424     subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader', 3));
2933 14 Nov 14 olle 425     addYearSubHeaders(periodStartDate, endDate, subHeaderRowYear, viewType);      
2933 14 Nov 14 olle 426     subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader', 2));
2933 14 Nov 14 olle 427   }    
2933 14 Nov 14 olle 428         
2933 14 Nov 14 olle 429   // Columnsheader    
4727 04 Apr 18 olle 430   var siteHeader = getTableCellElement('Hospital site', 'reportsubheader');      
2933 14 Nov 14 olle 431   var startDateHeader = getTableCellElement('Start date','reportsubheader');
2933 14 Nov 14 olle 432   var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
2933 14 Nov 14 olle 433   columnHeaderRow.appendChild(siteHeader);
2933 14 Nov 14 olle 434   columnHeaderRow.appendChild(startDateHeader);  
2933 14 Nov 14 olle 435   columnHeaderRow.appendChild(latestDateHeader);  
2933 14 Nov 14 olle 436   
2933 14 Nov 14 olle 437   if (viewType == 'MONTH') addMonthColumnHeaders(columnHeaderRow, periodStartDate);
2933 14 Nov 14 olle 438   else if (viewType == 'WEEK') addWeekColumnHeaders(columnHeaderRow, periodStartDate);
2933 14 Nov 14 olle 439   else if (viewType == 'QUARTER') addQuarterColumnHeaders(columnHeaderRow, periodStartDate);
2933 14 Nov 14 olle 440   else if (viewType == 'YEAR') addYearSubHeaders(periodStartDate, endDate, columnHeaderRow, viewType);
2933 14 Nov 14 olle 441   
2933 14 Nov 14 olle 442   
2933 14 Nov 14 olle 443   columnHeaderRow.appendChild(getTableCellElement('Sum', 'reportsubheader'));
2933 14 Nov 14 olle 444   columnHeaderRow.appendChild(getTableCellElement('Total', 'reportsubheader'));
2933 14 Nov 14 olle 445
2933 14 Nov 14 olle 446   // Build table      
2933 14 Nov 14 olle 447   reportTable.appendChild(headerRow);
2933 14 Nov 14 olle 448   reportTable.appendChild(subHeaderRowYear);
2933 14 Nov 14 olle 449   reportTable.appendChild(columnHeaderRow);
2933 14 Nov 14 olle 450         
2933 14 Nov 14 olle 451   // Data rows      
2933 14 Nov 14 olle 452   addDataRowsToTable(report, reportTable);
2933 14 Nov 14 olle 453     
2933 14 Nov 14 olle 454   // Add a row with the combined numbers for all sites for each period
2933 14 Nov 14 olle 455   var sitesCombinedRow = document.createElement('tr');
4727 04 Apr 18 olle 456   sitesCombinedRow.appendChild(getTableCellElement('Hospital sites combined', 'colsummary'));
2933 14 Nov 14 olle 457   sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary', 2));
2933 14 Nov 14 olle 458   // Get combined numbers for all sites for each period
2933 14 Nov 14 olle 459   var statistics = report.statistics;
2933 14 Nov 14 olle 460   var sitesCombined = statistics.sitesCombinedKey;    
2933 14 Nov 14 olle 461   var sortedKeyArray = createSortedPeriodArray(report, numCols);
2933 14 Nov 14 olle 462   var key;
2933 14 Nov 14 olle 463   for (arrayIndex in sortedKeyArray)
2933 14 Nov 14 olle 464   {
2933 14 Nov 14 olle 465     key = sortedKeyArray[arrayIndex];
2933 14 Nov 14 olle 466     var data = getJSONData(sitesCombined, key, 0);
2933 14 Nov 14 olle 467     // Add entry with sample sum for site for selected time period
2933 14 Nov 14 olle 468     sitesCombinedRow.appendChild(getTableCellElement(data,'colsummary'));
2933 14 Nov 14 olle 469   }
2933 14 Nov 14 olle 470   // Get total number of samples for site for the selected time period
2933 14 Nov 14 olle 471   var sum = getJSONData(statistics, 'sumKey', 0);
2933 14 Nov 14 olle 472   // Add entry with total number of samples for site for the selected time period
2933 14 Nov 14 olle 473   sitesCombinedRow.appendChild(getTableCellElement(sum, 'colsummary'));
2933 14 Nov 14 olle 474   // Get total number of samples for all sites, regardless of creation date
2933 14 Nov 14 olle 475   var total = getJSONData(statistics, 'totalKey', 0);
2933 14 Nov 14 olle 476   // Add entry with total number of samples for all sites, regardless of creation date
2933 14 Nov 14 olle 477   sitesCombinedRow.appendChild(getTableCellElement(total, 'colsummary'));
2933 14 Nov 14 olle 478   reportTable.appendChild(sitesCombinedRow);  
2933 14 Nov 14 olle 479
2933 14 Nov 14 olle 480   return reportTable;
2933 14 Nov 14 olle 481 }
2933 14 Nov 14 olle 482
2933 14 Nov 14 olle 483 function createOverviewReport(report)
2933 14 Nov 14 olle 484 {
2933 14 Nov 14 olle 485   var reportTable = getReportTable();
4174 24 Oct 16 olle 486   var projectName = report.projectName;
2933 14 Nov 14 olle 487   var projectFocusFilter = report.projectFocusFilter;
2933 14 Nov 14 olle 488   var sdString = report.beginDate;
2933 14 Nov 14 olle 489   var edString = report.endDate;
2933 14 Nov 14 olle 490   var ldString = report.latestDate;
2933 14 Nov 14 olle 491   var startDate = dateStrToDate(sdString);
2933 14 Nov 14 olle 492   var endDate = dateStrToDate(edString);
2933 14 Nov 14 olle 493   var latestDate = dateStrToDate(ldString);
2933 14 Nov 14 olle 494
2933 14 Nov 14 olle 495   var headerRow = document.createElement('tr');    
2933 14 Nov 14 olle 496   var subHeaderRow = document.createElement('tr');
2933 14 Nov 14 olle 497   var subHeader2Row = document.createElement('tr');
2933 14 Nov 14 olle 498   var columnHeaderRow = document.createElement('tr');
2933 14 Nov 14 olle 499
2933 14 Nov 14 olle 500   var numCols = 2;
2933 14 Nov 14 olle 501   var numDecimals = 0;
2933 14 Nov 14 olle 502   var headerText = 'Number of items of different kinds';
2933 14 Nov 14 olle 503   if (projectFocusFilter != null && projectFocusFilter != 'none')
2933 14 Nov 14 olle 504   {
2933 14 Nov 14 olle 505     projectFocusFilterDisplayText = getProjectFocusFilterDisplayText(projectFocusFilter);
2933 14 Nov 14 olle 506     headerText += ', project focus = \'' + projectFocusFilterDisplayText + '\'';
2933 14 Nov 14 olle 507   }
2933 14 Nov 14 olle 508   var startDateStr = addHyphensToDateString(sdString);
2933 14 Nov 14 olle 509   var endDateStr = addHyphensToDateString(edString);
2933 14 Nov 14 olle 510   var latestDateStr = addHyphensToDateString(ldString);
2933 14 Nov 14 olle 511   headerText += ' (betweeen ' + startDateStr + ' and ' + endDateStr + ')';
2933 14 Nov 14 olle 512   if (latestDate != null)
2933 14 Nov 14 olle 513   {
2933 14 Nov 14 olle 514       headerText += '\nLast registration ' + latestDateStr;
2933 14 Nov 14 olle 515   }
2933 14 Nov 14 olle 516   // Add top header line with program title and version  
4174 24 Oct 16 olle 517   headerText = projectName + ' [' + Report.TITLE + ' ' + Report.VERSION + ']\n' + headerText;  
2933 14 Nov 14 olle 518   headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+3)));
2933 14 Nov 14 olle 519   
2933 14 Nov 14 olle 520   // Subheader
2933 14 Nov 14 olle 521   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 3));
2933 14 Nov 14 olle 522   
2933 14 Nov 14 olle 523   subHeaderRow.appendChild(getTableCellElement('Patients', 'reportsubheader'));
2933 14 Nov 14 olle 524   subHeaderRow.appendChild(getTableCellElement('Specimens', 'reportsubheader'));
2933 14 Nov 14 olle 525
2933 14 Nov 14 olle 526   // Subheader 2
2933 14 Nov 14 olle 527   subHeader2Row.appendChild(getTableCellElement('', 'reportsubheader', 3));
2933 14 Nov 14 olle 528   
2933 14 Nov 14 olle 529   subHeader2Row.appendChild(getTableCellElement('', 'reportsubheader'));
2933 14 Nov 14 olle 530   subHeader2Row.appendChild(getTableCellElement('', 'reportsubheader'));
2933 14 Nov 14 olle 531
2933 14 Nov 14 olle 532   // Columnsheader    
4727 04 Apr 18 olle 533   var siteHeader = getTableCellElement('Hospital site', 'reportsubheader');      
2933 14 Nov 14 olle 534   var startDateHeader = getTableCellElement('Start date','reportsubheader');
2933 14 Nov 14 olle 535   var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
2933 14 Nov 14 olle 536   columnHeaderRow.appendChild(siteHeader);
2933 14 Nov 14 olle 537   columnHeaderRow.appendChild(startDateHeader);  
2933 14 Nov 14 olle 538   columnHeaderRow.appendChild(latestDateHeader);  
2933 14 Nov 14 olle 539
2933 14 Nov 14 olle 540   columnHeaderRow.appendChild(getTableCellElement('Patients', 'reportsubheader'));
2933 14 Nov 14 olle 541   columnHeaderRow.appendChild(getTableCellElement('Specimens', 'reportsubheader'));
2933 14 Nov 14 olle 542 /*
2933 14 Nov 14 olle 543   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2933 14 Nov 14 olle 544   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2933 14 Nov 14 olle 545 */
2933 14 Nov 14 olle 546
2933 14 Nov 14 olle 547   // Build table      
2933 14 Nov 14 olle 548   reportTable.appendChild(headerRow);
2933 14 Nov 14 olle 549 /*
2933 14 Nov 14 olle 550   reportTable.appendChild(subHeaderRow);
2933 14 Nov 14 olle 551   reportTable.appendChild(subHeader2Row);
2933 14 Nov 14 olle 552 */
2933 14 Nov 14 olle 553   reportTable.appendChild(columnHeaderRow);
2933 14 Nov 14 olle 554         
2933 14 Nov 14 olle 555   // Data rows      
2933 14 Nov 14 olle 556   addDataRowsToOverviewTable(report, reportTable);
2933 14 Nov 14 olle 557     
2933 14 Nov 14 olle 558   // Add a row with the combined numbers for all sites for each period
2933 14 Nov 14 olle 559   var sitesCombinedRow = document.createElement('tr');
4727 04 Apr 18 olle 560   sitesCombinedRow.appendChild(getTableCellElement('Hospital sites combined', 'colsummary'));
2933 14 Nov 14 olle 561   sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary', 2));
2933 14 Nov 14 olle 562   // Get combined numbers for all sites for each period
2933 14 Nov 14 olle 563   var noDateKey = 'noDate';
2933 14 Nov 14 olle 564   var sumKey = 'sumKey';
2933 14 Nov 14 olle 565   var statistics = report.statistics;
2933 14 Nov 14 olle 566   // Get values for use in summary section
2933 14 Nov 14 olle 567   numPatientsNoSamples = statistics.patientNoSamples;
2933 14 Nov 14 olle 568   var sitesCombined = statistics.sitesCombinedKey;
2933 14 Nov 14 olle 569   if (sitesCombined != null)
2933 14 Nov 14 olle 570   {
2933 14 Nov 14 olle 571     data = getJSONData(sitesCombined, 'patient');
2933 14 Nov 14 olle 572     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2933 14 Nov 14 olle 573     data = getJSONData(sitesCombined, 'specimen');
2933 14 Nov 14 olle 574     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2933 14 Nov 14 olle 575   }
2933 14 Nov 14 olle 576   reportTable.appendChild(sitesCombinedRow);  
2933 14 Nov 14 olle 577
2933 14 Nov 14 olle 578   return reportTable;
2933 14 Nov 14 olle 579 }
2933 14 Nov 14 olle 580
2933 14 Nov 14 olle 581 function createOverviewPatientWithSampleTable(report)
2933 14 Nov 14 olle 582 {
2933 14 Nov 14 olle 583   var reportTable = getReportTable();
4174 24 Oct 16 olle 584   var projectName = report.projectName;
2933 14 Nov 14 olle 585   var projectFocusFilter = report.projectFocusFilter;
2933 14 Nov 14 olle 586   var sdString = report.beginDate;
2933 14 Nov 14 olle 587   var edString = report.endDate;
2933 14 Nov 14 olle 588   var ldString = report.latestDate;
2933 14 Nov 14 olle 589   var startDate = dateStrToDate(sdString);
2933 14 Nov 14 olle 590   var endDate = dateStrToDate(edString);
2933 14 Nov 14 olle 591   var latestDate = dateStrToDate(ldString);
2933 14 Nov 14 olle 592
2933 14 Nov 14 olle 593   var headerRow = document.createElement('tr');    
2933 14 Nov 14 olle 594   var subHeaderRow = document.createElement('tr');
2933 14 Nov 14 olle 595   var subHeader2Row = document.createElement('tr');
2933 14 Nov 14 olle 596   var columnHeaderRow = document.createElement('tr');
2933 14 Nov 14 olle 597   
2933 14 Nov 14 olle 598   var numCols = 4;
2933 14 Nov 14 olle 599   var numDecimals = 0;
2933 14 Nov 14 olle 600   var headerText = 'Patients having different number of specimens';
2933 14 Nov 14 olle 601   if (projectFocusFilter != null && projectFocusFilter != 'none')
2933 14 Nov 14 olle 602   {
2933 14 Nov 14 olle 603     projectFocusFilterDisplayText = getProjectFocusFilterDisplayText(projectFocusFilter);
2933 14 Nov 14 olle 604     headerText += ', project focus = \'' + projectFocusFilterDisplayText + '\'';
2933 14 Nov 14 olle 605   }
2933 14 Nov 14 olle 606   var startDateStr = addHyphensToDateString(sdString);
2933 14 Nov 14 olle 607   var endDateStr = addHyphensToDateString(edString);
2933 14 Nov 14 olle 608   var latestDateStr = addHyphensToDateString(ldString);
2933 14 Nov 14 olle 609   headerText += ' (betweeen ' + startDateStr + ' and ' + endDateStr + ')';
2933 14 Nov 14 olle 610 /*
2933 14 Nov 14 olle 611   headerText += '\nColumn entries are non-exclusive, i.e. a patient may be represented in several columns';
2933 14 Nov 14 olle 612 */
2933 14 Nov 14 olle 613   // Add top header line with program title and version  
4174 24 Oct 16 olle 614   headerText = projectName + ' [' + Report.TITLE + ' ' + Report.VERSION + ']\n' + headerText;  
2933 14 Nov 14 olle 615   headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+3)));
2933 14 Nov 14 olle 616   
2933 14 Nov 14 olle 617   // Subheader
2933 14 Nov 14 olle 618   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 3));
2933 14 Nov 14 olle 619   
2933 14 Nov 14 olle 620   subHeaderRow.appendChild(getTableCellElement('Patients', 'reportsubheader'));
2933 14 Nov 14 olle 621   subHeaderRow.appendChild(getTableCellElement('with', 'reportsubheader'));
2933 14 Nov 14 olle 622   subHeaderRow.appendChild(getTableCellElement('with', 'reportsubheader'));
2933 14 Nov 14 olle 623   subHeaderRow.appendChild(getTableCellElement('with', 'reportsubheader'));
2933 14 Nov 14 olle 624
2933 14 Nov 14 olle 625 /*
2933 14 Nov 14 olle 626   // Subheader 2
2933 14 Nov 14 olle 627   subHeader2Row.appendChild(getTableCellElement('', 'reportsubheader', 3));
2933 14 Nov 14 olle 628   
2933 14 Nov 14 olle 629   subHeader2Row.appendChild(getTableCellElement('total', 'reportsubheader'));
2933 14 Nov 14 olle 630   subHeader2Row.appendChild(getTableCellElement('specimen(s)', 'reportsubheader'));
2933 14 Nov 14 olle 631 */
2933 14 Nov 14 olle 632
2933 14 Nov 14 olle 633   // Columnsheader    
4727 04 Apr 18 olle 634   var siteHeader = getTableCellElement('Hospital site', 'reportsubheader');      
2933 14 Nov 14 olle 635   var startDateHeader = getTableCellElement('Start date','reportsubheader');
2933 14 Nov 14 olle 636   var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
2933 14 Nov 14 olle 637   columnHeaderRow.appendChild(siteHeader);
2933 14 Nov 14 olle 638   columnHeaderRow.appendChild(startDateHeader);  
2933 14 Nov 14 olle 639   columnHeaderRow.appendChild(latestDateHeader);
2933 14 Nov 14 olle 640
2933 14 Nov 14 olle 641   columnHeaderRow.appendChild(getTableCellElement('total', 'reportsubheader'));
2933 14 Nov 14 olle 642   columnHeaderRow.appendChild(getTableCellElement('1 specimen', 'reportsubheader'));
2933 14 Nov 14 olle 643   columnHeaderRow.appendChild(getTableCellElement('2 specimens', 'reportsubheader'));
2933 14 Nov 14 olle 644   columnHeaderRow.appendChild(getTableCellElement('3+ specimens', 'reportsubheader'));
2933 14 Nov 14 olle 645 /*
2933 14 Nov 14 olle 646   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2933 14 Nov 14 olle 647   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2933 14 Nov 14 olle 648 */
2933 14 Nov 14 olle 649
2933 14 Nov 14 olle 650   // Build table      
2933 14 Nov 14 olle 651   reportTable.appendChild(headerRow);
2933 14 Nov 14 olle 652   reportTable.appendChild(subHeaderRow);
2933 14 Nov 14 olle 653 /*
2933 14 Nov 14 olle 654   reportTable.appendChild(subHeader2Row);
2933 14 Nov 14 olle 655 */
2933 14 Nov 14 olle 656   reportTable.appendChild(columnHeaderRow);
2933 14 Nov 14 olle 657         
2933 14 Nov 14 olle 658   // Data rows      
2933 14 Nov 14 olle 659   addDataRowsToOverviewPatientWithSampleTable(report, reportTable);
2933 14 Nov 14 olle 660     
2933 14 Nov 14 olle 661   // Add a row with the combined numbers for all sites for each period
2933 14 Nov 14 olle 662   var sitesCombinedRow = document.createElement('tr');
4727 04 Apr 18 olle 663   sitesCombinedRow.appendChild(getTableCellElement('Hospital sites combined', 'colsummary'));
2933 14 Nov 14 olle 664   sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary', 2));
2933 14 Nov 14 olle 665   // Get combined numbers for all sites for each period
2933 14 Nov 14 olle 666   var noDateKey = 'noDate';
2933 14 Nov 14 olle 667   var sumKey = 'sumKey';
2933 14 Nov 14 olle 668   var statistics = report.statistics;
2933 14 Nov 14 olle 669   // Get values for use in summary section
2933 14 Nov 14 olle 670   numPatientsNoSamples = statistics.patientNoSamples;
2933 14 Nov 14 olle 671   var sitesCombined = statistics.sitesCombinedKey;
2933 14 Nov 14 olle 672   if (sitesCombined != null)
2933 14 Nov 14 olle 673   {
2933 14 Nov 14 olle 674     data = getJSONData(sitesCombined, 'patient');
2933 14 Nov 14 olle 675     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2933 14 Nov 14 olle 676 /*
2933 14 Nov 14 olle 677     data = getJSONData(sitesCombined, 'patientWithSpecimen');
2933 14 Nov 14 olle 678     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2933 14 Nov 14 olle 679 */
2933 14 Nov 14 olle 680     data = getJSONData(sitesCombined, 'patientWithOneSpecimen');
2933 14 Nov 14 olle 681     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2933 14 Nov 14 olle 682     data = getJSONData(sitesCombined, 'patientWithTwoSpecimen');
2933 14 Nov 14 olle 683     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2933 14 Nov 14 olle 684     data = getJSONData(sitesCombined, 'patientWithThreeOrMoreSpecimen');
2933 14 Nov 14 olle 685     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2933 14 Nov 14 olle 686   }
2933 14 Nov 14 olle 687   reportTable.appendChild(sitesCombinedRow);  
2933 14 Nov 14 olle 688
2933 14 Nov 14 olle 689   return reportTable;
2933 14 Nov 14 olle 690 }
2933 14 Nov 14 olle 691
2933 14 Nov 14 olle 692 function createMissingSampleDataReport(report)
2933 14 Nov 14 olle 693 {
2933 14 Nov 14 olle 694   var reportTable = getReportTable();
4174 24 Oct 16 olle 695   var projectName = report.projectName;
2933 14 Nov 14 olle 696   var sdString = report.beginDate;
2933 14 Nov 14 olle 697   var edString = report.endDate;
2933 14 Nov 14 olle 698   var ldString = report.latestDate;
2933 14 Nov 14 olle 699   var startDate = dateStrToDate(sdString);
2933 14 Nov 14 olle 700   var endDate = dateStrToDate(edString);
2933 14 Nov 14 olle 701   var latestDate = dateStrToDate(ldString);
2933 14 Nov 14 olle 702
2933 14 Nov 14 olle 703   var sampleType = report.sampleType;
2933 14 Nov 14 olle 704   var projectFocusFilter = report.projectFocusFilter;
2933 14 Nov 14 olle 705   var permissionDeniedForPatientName = report.permissionDeniedForPatientName;
2933 14 Nov 14 olle 706   var permissionDeniedForPad = report.permissionDeniedForPad;
2933 14 Nov 14 olle 707
2933 14 Nov 14 olle 708   var headerRow = document.createElement('tr');    
2933 14 Nov 14 olle 709   var subHeaderRow = document.createElement('tr');
2933 14 Nov 14 olle 710   var subHeader2Row = document.createElement('tr');
2933 14 Nov 14 olle 711   var columnHeaderRow = document.createElement('tr');
2933 14 Nov 14 olle 712   
2933 14 Nov 14 olle 713   var numCols = 5;
2933 14 Nov 14 olle 714   if (sampleType == 'specimen')
2933 14 Nov 14 olle 715   {
2933 14 Nov 14 olle 716     numCols = 6;
2933 14 Nov 14 olle 717   }
2933 14 Nov 14 olle 718   else if (sampleType == 'nospecimen')
2933 14 Nov 14 olle 719   {
2933 14 Nov 14 olle 720     numCols = 4;
2933 14 Nov 14 olle 721   }
2933 14 Nov 14 olle 722   else if (sampleType == 'blood')
2933 14 Nov 14 olle 723   {
2933 14 Nov 14 olle 724     numCols = 3;
2933 14 Nov 14 olle 725   }
2933 14 Nov 14 olle 726   var numDecimals = 0;
2933 14 Nov 14 olle 727   var headerText = 'Number of missing specimen items of different kinds';
2933 14 Nov 14 olle 728   if (projectFocusFilter != null && projectFocusFilter != 'none')
2933 14 Nov 14 olle 729   {
2933 14 Nov 14 olle 730     projectFocusFilterDisplayText = getProjectFocusFilterDisplayText(projectFocusFilter);
2933 14 Nov 14 olle 731     headerText += ', project focus = \'' + projectFocusFilterDisplayText + '\'';
2933 14 Nov 14 olle 732   }
2933 14 Nov 14 olle 733   var startDateStr = addHyphensToDateString(sdString);
2933 14 Nov 14 olle 734   var endDateStr = addHyphensToDateString(edString);
2933 14 Nov 14 olle 735   var latestDateStr = addHyphensToDateString(ldString);
2933 14 Nov 14 olle 736   headerText += ' (betweeen ' + startDateStr + ' and ' + endDateStr + ')';
2933 14 Nov 14 olle 737   if (latestDate != null)
2933 14 Nov 14 olle 738   {
2933 14 Nov 14 olle 739       headerText += '\nLast registration ' + latestDateStr;
2933 14 Nov 14 olle 740   }
2933 14 Nov 14 olle 741   // Add top header line with program title and version  
4174 24 Oct 16 olle 742   headerText = projectName + ' [' + Report.TITLE + ' ' + Report.VERSION + ']\n' + headerText;  
2933 14 Nov 14 olle 743   headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+3)));
2933 14 Nov 14 olle 744   
2933 14 Nov 14 olle 745   // Subheader
2933 14 Nov 14 olle 746   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 3));
2933 14 Nov 14 olle 747   
2933 14 Nov 14 olle 748   subHeaderRow.appendChild(getTableCellElement('Patient', 'reportsubheader'));
2933 14 Nov 14 olle 749   subHeaderRow.appendChild(getTableCellElement('Patient', 'reportsubheader'));
2933 14 Nov 14 olle 750   if (sampleType == 'specimen')
2933 14 Nov 14 olle 751   {
2933 14 Nov 14 olle 752     subHeaderRow.appendChild(getTableCellElement('PAD', 'reportsubheader'));
2933 14 Nov 14 olle 753     subHeaderRow.appendChild(getTableCellElement('Sampling', 'reportsubheader'));
2933 14 Nov 14 olle 754   }
2933 14 Nov 14 olle 755
2933 14 Nov 14 olle 756   // Columnsheader    
4727 04 Apr 18 olle 757   var siteHeader = getTableCellElement('Hospital site', 'reportsubheader');      
2933 14 Nov 14 olle 758   var startDateHeader = getTableCellElement('Start date','reportsubheader');
2933 14 Nov 14 olle 759   var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
2933 14 Nov 14 olle 760   columnHeaderRow.appendChild(siteHeader);
2933 14 Nov 14 olle 761   columnHeaderRow.appendChild(startDateHeader);  
2933 14 Nov 14 olle 762   columnHeaderRow.appendChild(latestDateHeader);  
2933 14 Nov 14 olle 763   
2933 14 Nov 14 olle 764   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2933 14 Nov 14 olle 765   columnHeaderRow.appendChild(getTableCellElement('name', 'reportsubheader'));
2933 14 Nov 14 olle 766   if (sampleType == 'specimen')
2933 14 Nov 14 olle 767   {
2933 14 Nov 14 olle 768     columnHeaderRow.appendChild(getTableCellElement('reference', 'reportsubheader'));
2933 14 Nov 14 olle 769     columnHeaderRow.appendChild(getTableCellElement('date', 'reportsubheader'));
2933 14 Nov 14 olle 770   }
2933 14 Nov 14 olle 771
2933 14 Nov 14 olle 772   // Build table      
2933 14 Nov 14 olle 773   reportTable.appendChild(headerRow);
2933 14 Nov 14 olle 774   reportTable.appendChild(subHeaderRow);
2933 14 Nov 14 olle 775   reportTable.appendChild(columnHeaderRow);
2933 14 Nov 14 olle 776         
2933 14 Nov 14 olle 777   // Data rows      
2933 14 Nov 14 olle 778   addDataRowsToMissingSampleDataTable(report, reportTable);
2933 14 Nov 14 olle 779     
2933 14 Nov 14 olle 780   // Add a row with the combined numbers for all sites for each period
2933 14 Nov 14 olle 781   var sitesCombinedRow = document.createElement('tr');
4727 04 Apr 18 olle 782   sitesCombinedRow.appendChild(getTableCellElement('Hospital sites combined', 'colsummary'));
2933 14 Nov 14 olle 783   sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary', 2));
2933 14 Nov 14 olle 784   // Get combined numbers for all sites for each period
2933 14 Nov 14 olle 785   var noDateKey = 'noDate';
2933 14 Nov 14 olle 786   var sumKey = 'sumKey';
2933 14 Nov 14 olle 787   var statistics = report.statistics;
2933 14 Nov 14 olle 788   var sitesCombined = statistics.sitesCombinedKey;
2933 14 Nov 14 olle 789   if (sitesCombined != null)
2933 14 Nov 14 olle 790   {
2933 14 Nov 14 olle 791     data = getJSONData(sitesCombined, 'missingPatient');
2933 14 Nov 14 olle 792     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2933 14 Nov 14 olle 793     if (!permissionDeniedForPatientName)
2933 14 Nov 14 olle 794     {
2933 14 Nov 14 olle 795       data = getJSONData(sitesCombined, 'missingPatientName');
2933 14 Nov 14 olle 796       sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2933 14 Nov 14 olle 797     }
2933 14 Nov 14 olle 798     else
2933 14 Nov 14 olle 799     {
2933 14 Nov 14 olle 800       data = '-';
2933 14 Nov 14 olle 801       sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2933 14 Nov 14 olle 802     }
2933 14 Nov 14 olle 803     if (sampleType == 'specimen')
2933 14 Nov 14 olle 804     {
2933 14 Nov 14 olle 805       if (!permissionDeniedForPad)
2933 14 Nov 14 olle 806       {
2933 14 Nov 14 olle 807         data = getJSONData(sitesCombined, 'missingPadReference');
2933 14 Nov 14 olle 808         sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2933 14 Nov 14 olle 809       }
2933 14 Nov 14 olle 810       else
2933 14 Nov 14 olle 811       {
2933 14 Nov 14 olle 812         data = '-';
2933 14 Nov 14 olle 813         sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2933 14 Nov 14 olle 814       }
2933 14 Nov 14 olle 815       data = getJSONData(sitesCombined, 'missingSamplingDateTime');
2933 14 Nov 14 olle 816       sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2933 14 Nov 14 olle 817     }
2933 14 Nov 14 olle 818   }
2933 14 Nov 14 olle 819   reportTable.appendChild(sitesCombinedRow);  
2933 14 Nov 14 olle 820
2933 14 Nov 14 olle 821   return reportTable;
2933 14 Nov 14 olle 822 }
2933 14 Nov 14 olle 823
2933 14 Nov 14 olle 824 function addDataRowsToOverviewTable(report, reportTable)
2933 14 Nov 14 olle 825 {
2933 14 Nov 14 olle 826   var sites = report.sites;    
2933 14 Nov 14 olle 827   var statistics = report.statistics;
2933 14 Nov 14 olle 828   unknownCreation = statistics.noDate;
2933 14 Nov 14 olle 829   unknownSite = statistics.unknownSite;
2933 14 Nov 14 olle 830   unknownPatientSite = statistics.unknownPatientSite;
2933 14 Nov 14 olle 831   for (var siteNo = 0; siteNo < sites.length; siteNo++)
2933 14 Nov 14 olle 832   {
2933 14 Nov 14 olle 833     var site = sites[siteNo];
2933 14 Nov 14 olle 834     var siteName = site.name;        
2933 14 Nov 14 olle 835     var siteStartDate = dateStrToDate(site.startDate);
2933 14 Nov 14 olle 836     var siteStartDateStr = addHyphensToDateString(site.startDate);
2933 14 Nov 14 olle 837     
2933 14 Nov 14 olle 838     var siteData = statistics[site.prefix];      
2933 14 Nov 14 olle 839     var siteLatestDate = siteData['latestDateKey'];
2933 14 Nov 14 olle 840     var siteLatestDateStr = addHyphensToDateString(siteLatestDate);
2933 14 Nov 14 olle 841     var tableRow = document.createElement('tr');
2933 14 Nov 14 olle 842     var tableCol = getTableCellElement(siteName, 'rowtitle');
2933 14 Nov 14 olle 843     tableRow.appendChild(tableCol);
2933 14 Nov 14 olle 844     tableRow.appendChild(getTableCellElement(siteStartDateStr, 'reportdata'));
2933 14 Nov 14 olle 845     tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
2933 14 Nov 14 olle 846     var noDateKey = 'noDate';
2933 14 Nov 14 olle 847     var sumKey = 'sumKey';
2933 14 Nov 14 olle 848     var totalKey = 'totalKey';
2933 14 Nov 14 olle 849     if (siteData != null)
2933 14 Nov 14 olle 850     {
2933 14 Nov 14 olle 851       data = getJSONData(siteData, 'patient');
2933 14 Nov 14 olle 852       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 853       data = getJSONData(siteData, 'specimen');
2933 14 Nov 14 olle 854       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 855     }
2933 14 Nov 14 olle 856     reportTable.appendChild(tableRow);
2933 14 Nov 14 olle 857   }
2933 14 Nov 14 olle 858 }
2933 14 Nov 14 olle 859
2933 14 Nov 14 olle 860 function addDataRowsToOverviewPatientWithSampleTable(report, reportTable)
2933 14 Nov 14 olle 861 {
2933 14 Nov 14 olle 862   var sites = report.sites;    
2933 14 Nov 14 olle 863   var statistics = report.statistics;
2933 14 Nov 14 olle 864   unknownCreation = statistics.noDate;
2933 14 Nov 14 olle 865   unknownSite = statistics.unknownSite;
2933 14 Nov 14 olle 866   unknownPatientSite = statistics.unknownPatientSite;
2933 14 Nov 14 olle 867   for (var siteNo = 0; siteNo < sites.length; siteNo++)
2933 14 Nov 14 olle 868   {        
2933 14 Nov 14 olle 869     var site = sites[siteNo];
2933 14 Nov 14 olle 870     var siteName = site.name;        
2933 14 Nov 14 olle 871     var siteStartDate = dateStrToDate(site.startDate);
2933 14 Nov 14 olle 872     var siteStartDateStr = addHyphensToDateString(site.startDate);
2933 14 Nov 14 olle 873     
2933 14 Nov 14 olle 874     var siteData = statistics[site.prefix];      
2933 14 Nov 14 olle 875     var siteLatestDate = siteData['latestDateKey'];
2933 14 Nov 14 olle 876     var siteLatestDateStr = addHyphensToDateString(siteLatestDate);
2933 14 Nov 14 olle 877     var tableRow = document.createElement('tr');
2933 14 Nov 14 olle 878     var tableCol = getTableCellElement(siteName, 'rowtitle');
2933 14 Nov 14 olle 879     tableRow.appendChild(tableCol);
2933 14 Nov 14 olle 880     tableRow.appendChild(getTableCellElement(siteStartDateStr, 'reportdata'));
2933 14 Nov 14 olle 881     tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
2933 14 Nov 14 olle 882     var noDateKey = 'noDate';
2933 14 Nov 14 olle 883     var sumKey = 'sumKey';
2933 14 Nov 14 olle 884     var totalKey = 'totalKey';
2933 14 Nov 14 olle 885     if (siteData != null)
2933 14 Nov 14 olle 886     {
2933 14 Nov 14 olle 887       data = getJSONData(siteData, 'patient');
2933 14 Nov 14 olle 888       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 889 /*
2933 14 Nov 14 olle 890       data = getJSONData(siteData, 'patientWithSpecimen');
2933 14 Nov 14 olle 891       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 892 */
2933 14 Nov 14 olle 893       data = getJSONData(siteData, 'patientWithOneSpecimen');
2933 14 Nov 14 olle 894       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 895       data = getJSONData(siteData, 'patientWithTwoSpecimen');
2933 14 Nov 14 olle 896       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 897       data = getJSONData(siteData, 'patientWithThreeOrMoreSpecimen');
2933 14 Nov 14 olle 898       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 899     }
2933 14 Nov 14 olle 900     reportTable.appendChild(tableRow);
2933 14 Nov 14 olle 901   }
2933 14 Nov 14 olle 902 }
2933 14 Nov 14 olle 903
2933 14 Nov 14 olle 904 function addDataRowsToOverviewPatientDetailedTable(report, reportTable)
2933 14 Nov 14 olle 905 {
2933 14 Nov 14 olle 906   var sites = report.sites;    
2933 14 Nov 14 olle 907   var statistics = report.statistics;
2933 14 Nov 14 olle 908   unknownCreation = statistics.noDate;
2933 14 Nov 14 olle 909   unknownSite = statistics.unknownSite;
2933 14 Nov 14 olle 910   unknownPatientSite = statistics.unknownPatientSite;
2933 14 Nov 14 olle 911   for (var siteNo = 0; siteNo < sites.length; siteNo++)
2933 14 Nov 14 olle 912   {    
2933 14 Nov 14 olle 913     var site = sites[siteNo];
2933 14 Nov 14 olle 914     var siteName = site.name;        
2933 14 Nov 14 olle 915     var siteStartDate = dateStrToDate(site.startDate);
2933 14 Nov 14 olle 916     var siteStartDateStr = addHyphensToDateString(site.startDate);
2933 14 Nov 14 olle 917     
2933 14 Nov 14 olle 918     var siteData = statistics[site.prefix];
2933 14 Nov 14 olle 919     var tableRow = document.createElement('tr');
2933 14 Nov 14 olle 920     var tableCol = getTableCellElement(siteName, 'rowtitle');
2933 14 Nov 14 olle 921     tableRow.appendChild(tableCol);
2933 14 Nov 14 olle 922     tableRow.appendChild(getTableCellElement(siteStartDateStr, 'reportdata'));
2933 14 Nov 14 olle 923     var noDateKey = 'noDate';
2933 14 Nov 14 olle 924     var sumKey = 'sumKey';
2933 14 Nov 14 olle 925     var totalKey = 'totalKey';
2933 14 Nov 14 olle 926     if (siteData != null)
2933 14 Nov 14 olle 927     {
2933 14 Nov 14 olle 928       data = getJSONData(siteData, 'patientBloodSampleOnly');
2933 14 Nov 14 olle 929       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 930       data = getJSONData(siteData, 'patientSpecimenOnly');
2933 14 Nov 14 olle 931       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 932       data = getJSONData(siteData, 'patientNoSpecimenOnly');
2933 14 Nov 14 olle 933       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 934       data = getJSONData(siteData, 'patientBloodSampleAndSpecimen');
2933 14 Nov 14 olle 935       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 936       data = getJSONData(siteData, 'patientBloodSampleAndNoSpecimen');
2933 14 Nov 14 olle 937       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 938       data = getJSONData(siteData, 'patientSpecimenAndNoSpecimen');
2933 14 Nov 14 olle 939       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 940       data = getJSONData(siteData, 'patientBloodSampleAndSpecimenAndNoSpecimen');
2933 14 Nov 14 olle 941       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 942       //data = getJSONData(siteData, 'patientNoSamples');
2933 14 Nov 14 olle 943       //tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 944       data = getJSONData(siteData, 'sumKey');
2933 14 Nov 14 olle 945       tableRow.appendChild(getTableCellElement(data, 'rowsummary'));
2933 14 Nov 14 olle 946     }
2933 14 Nov 14 olle 947     reportTable.appendChild(tableRow);
2933 14 Nov 14 olle 948   }
2933 14 Nov 14 olle 949 }
2933 14 Nov 14 olle 950
2933 14 Nov 14 olle 951 function addDataRowsToMissingSampleDataTable(report, reportTable)
2933 14 Nov 14 olle 952 {
2933 14 Nov 14 olle 953   var sites = report.sites;    
2933 14 Nov 14 olle 954   var statistics = report.statistics;
2933 14 Nov 14 olle 955   var sampleType = report.sampleType;
2933 14 Nov 14 olle 956   var permissionDeniedForPatientName = report.permissionDeniedForPatientName;
2933 14 Nov 14 olle 957   var permissionDeniedForPad = report.permissionDeniedForPad;
2933 14 Nov 14 olle 958   var unknownCreation = statistics.noDate;
2933 14 Nov 14 olle 959   var unknownSite = statistics.unknownSite;
2933 14 Nov 14 olle 960   for (var siteNo = 0; siteNo < sites.length; siteNo++)
2933 14 Nov 14 olle 961   {      
2933 14 Nov 14 olle 962     var site = sites[siteNo];
2933 14 Nov 14 olle 963     var siteName = site.name;
2933 14 Nov 14 olle 964     var siteStartDate = dateStrToDate(site.startDate);
2933 14 Nov 14 olle 965     var siteStartDateStr = addHyphensToDateString(site.startDate);
2933 14 Nov 14 olle 966     
2933 14 Nov 14 olle 967     var siteData = statistics[site.prefix];      
2933 14 Nov 14 olle 968     var siteLatestDate = siteData['latestDateKey'];
2933 14 Nov 14 olle 969     var siteLatestDateStr = addHyphensToDateString(siteLatestDate);
2933 14 Nov 14 olle 970     var tableRow = document.createElement('tr');
2933 14 Nov 14 olle 971     var tableCol = getTableCellElement(siteName, 'rowtitle');
2933 14 Nov 14 olle 972     tableRow.appendChild(tableCol);
2933 14 Nov 14 olle 973     tableRow.appendChild(getTableCellElement(siteStartDateStr, 'reportdata'));
2933 14 Nov 14 olle 974     tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
2933 14 Nov 14 olle 975     //var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());      
2933 14 Nov 14 olle 976     var noDateKey = 'noDate';
2933 14 Nov 14 olle 977     var sumKey = 'sumKey';
2933 14 Nov 14 olle 978     var totalKey = 'totalKey';
2933 14 Nov 14 olle 979     if (siteData != null)
2933 14 Nov 14 olle 980     {
2933 14 Nov 14 olle 981       data = getJSONData(siteData, 'missingPatient');
2933 14 Nov 14 olle 982       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 983       if (!permissionDeniedForPatientName)
2933 14 Nov 14 olle 984       {
2933 14 Nov 14 olle 985         data = getJSONData(siteData, 'missingPatientName');
2933 14 Nov 14 olle 986         tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 987       }
2933 14 Nov 14 olle 988       else
2933 14 Nov 14 olle 989       {
2933 14 Nov 14 olle 990         data = '-';
2933 14 Nov 14 olle 991         tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 992       }
2933 14 Nov 14 olle 993       if (sampleType == 'specimen')
2933 14 Nov 14 olle 994       {
2933 14 Nov 14 olle 995         if (!permissionDeniedForPad)
2933 14 Nov 14 olle 996         {
2933 14 Nov 14 olle 997           data = getJSONData(siteData, 'missingPadReference');
2933 14 Nov 14 olle 998           tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 999         }
2933 14 Nov 14 olle 1000         else
2933 14 Nov 14 olle 1001         {
2933 14 Nov 14 olle 1002           data = '-';
2933 14 Nov 14 olle 1003           tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 1004         }
2933 14 Nov 14 olle 1005
2933 14 Nov 14 olle 1006         data = getJSONData(siteData, 'missingSamplingDateTime');
2933 14 Nov 14 olle 1007         tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 1008       }
2933 14 Nov 14 olle 1009     }
2933 14 Nov 14 olle 1010     reportTable.appendChild(tableRow);
2933 14 Nov 14 olle 1011   }
2933 14 Nov 14 olle 1012 }
2933 14 Nov 14 olle 1013
2933 14 Nov 14 olle 1014 function createLink(name, id, itemType, title)
2933 14 Nov 14 olle 1015 {
2933 14 Nov 14 olle 1016   var link = document.createElement('span');
2933 14 Nov 14 olle 1017   link.className = 'link';
2933 14 Nov 14 olle 1018   link.title = title;
2933 14 Nov 14 olle 1019   link.innerHTML = name;
2933 14 Nov 14 olle 1020   Events.addEventHandler(link, 'click', Items.itemOnClick, {'item-id': id, 'item-type': itemType, 'no-edit': 1});
2933 14 Nov 14 olle 1021   return link;
2933 14 Nov 14 olle 1022 }
2933 14 Nov 14 olle 1023
2933 14 Nov 14 olle 1024 function createTableCellElementChild(child, clazz, colspan, rowspan)
2933 14 Nov 14 olle 1025 {
2933 14 Nov 14 olle 1026   var cellElement = document.createElement('td');
2933 14 Nov 14 olle 1027   cellElement.setAttribute('class', clazz);
2933 14 Nov 14 olle 1028   if (colspan != null) cellElement.setAttribute('colspan', colspan);
2933 14 Nov 14 olle 1029   if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
2933 14 Nov 14 olle 1030   cellElement.appendChild(child);
2933 14 Nov 14 olle 1031   
2933 14 Nov 14 olle 1032   return cellElement;
2933 14 Nov 14 olle 1033 }
2933 14 Nov 14 olle 1034
2933 14 Nov 14 olle 1035 function getJSONDataWithPercent(jsonObject, key, sumKey, numDecimals)
2933 14 Nov 14 olle 1036 {
2933 14 Nov 14 olle 1037   var dataNum = getJSONData(jsonObject, key);
2933 14 Nov 14 olle 1038   var dataSum = getJSONData(jsonObject, sumKey);
2933 14 Nov 14 olle 1039   var dataPct = '0';
2933 14 Nov 14 olle 1040   if (dataSum != null && dataSum != 0)
2933 14 Nov 14 olle 1041   {
2933 14 Nov 14 olle 1042     dataPct = 100*dataNum/dataSum;
2933 14 Nov 14 olle 1043     dataPct = dataPct.toFixed(numDecimals);
2933 14 Nov 14 olle 1044   }
2933 14 Nov 14 olle 1045   var data = dataNum + ' (' + dataPct + '%)';
2933 14 Nov 14 olle 1046   return data;
2933 14 Nov 14 olle 1047 }
2933 14 Nov 14 olle 1048
2933 14 Nov 14 olle 1049 function getJSONData(jsonObject, key)
2933 14 Nov 14 olle 1050 {
2933 14 Nov 14 olle 1051   var data = getJSONData(jsonObject, key, '');
2933 14 Nov 14 olle 1052   return data;
2933 14 Nov 14 olle 1053 }
2933 14 Nov 14 olle 1054
2933 14 Nov 14 olle 1055 function getJSONData(jsonObject, key, defaultChoice)
2933 14 Nov 14 olle 1056 {
2933 14 Nov 14 olle 1057   var data = defaultChoice;
2933 14 Nov 14 olle 1058   if (jsonObject != null)
2933 14 Nov 14 olle 1059   {
2933 14 Nov 14 olle 1060     if (jsonObject[key] != null)
2933 14 Nov 14 olle 1061     {
2933 14 Nov 14 olle 1062       data = jsonObject[key];
2933 14 Nov 14 olle 1063     }
2933 14 Nov 14 olle 1064   }
2933 14 Nov 14 olle 1065   return data;
2933 14 Nov 14 olle 1066 }
2933 14 Nov 14 olle 1067
2933 14 Nov 14 olle 1068 function addQuarterColumnHeaders(columnHeaderRow, startDate)
2933 14 Nov 14 olle 1069 {
2933 14 Nov 14 olle 1070   var currentDate = startDate;
2933 14 Nov 14 olle 1071   for (var i=0;i<numCols;i++)
2933 14 Nov 14 olle 1072   {
2933 14 Nov 14 olle 1073     var quarter = Math.floor(currentDate.getMonth()/3)+1;
2933 14 Nov 14 olle 1074     var columnText = 'Q'+quarter;
2933 14 Nov 14 olle 1075     var quarterHeader = getTableCellElement(columnText, 'reportsubheader');
2933 14 Nov 14 olle 1076     columnHeaderRow.appendChild(quarterHeader);  
2933 14 Nov 14 olle 1077     currentDate.setMonth(currentDate.getMonth()+3);      
2933 14 Nov 14 olle 1078   }
2933 14 Nov 14 olle 1079 }
2933 14 Nov 14 olle 1080
2933 14 Nov 14 olle 1081 function addWeekColumnHeaders(columnHeaderRow, startDate)
2933 14 Nov 14 olle 1082 {
2933 14 Nov 14 olle 1083   var currentDate = startDate;
2933 14 Nov 14 olle 1084   var day = currentDate.getDay()-1;
2933 14 Nov 14 olle 1085   day = day>=0 ? day: day + 7;
2933 14 Nov 14 olle 1086   currentDate.setDate(currentDate.getDate()-day);
2933 14 Nov 14 olle 1087   for (var i=0;i<numCols;i++)
2933 14 Nov 14 olle 1088   {      
2933 14 Nov 14 olle 1089     var weekNum = getISOWeekNumber(currentDate);
2933 14 Nov 14 olle 1090     var columnText = weekNum;
2933 14 Nov 14 olle 1091     if (weekNum < 10) columnText = '0'+columnText;      
2933 14 Nov 14 olle 1092     columnHeaderRow.appendChild(getTableCellElement(columnText, 'reportsubheader'));
2933 14 Nov 14 olle 1093     currentDate.setDate(currentDate.getDate()+7);      
2933 14 Nov 14 olle 1094   }
2933 14 Nov 14 olle 1095 }
2933 14 Nov 14 olle 1096
2933 14 Nov 14 olle 1097 function addMonthColumnHeaders(columnHeaderRow, startDate)
2933 14 Nov 14 olle 1098 {    
2933 14 Nov 14 olle 1099   var currentDate = new Date(startDate.getFullYear(), startDate.getMonth());
2933 14 Nov 14 olle 1100   for (var i=0;i<numCols;i++)
2933 14 Nov 14 olle 1101   {              
2933 14 Nov 14 olle 1102     var monthHeader = getTableCellElement(month[currentDate.getMonth()], 'reportsubheader');
2933 14 Nov 14 olle 1103     columnHeaderRow.appendChild(monthHeader);        
2933 14 Nov 14 olle 1104     currentDate.setMonth(currentDate.getMonth() +1);
2933 14 Nov 14 olle 1105   }    
2933 14 Nov 14 olle 1106 }
2933 14 Nov 14 olle 1107
2933 14 Nov 14 olle 1108 function addYearSubHeaders(startDate, endDate, subHeaderRowYear, vt)
2933 14 Nov 14 olle 1109 {    
2933 14 Nov 14 olle 1110   var currentYear = startDate.getFullYear();  
2933 14 Nov 14 olle 1111   
2933 14 Nov 14 olle 1112   var columnCounter = 0;    
2933 14 Nov 14 olle 1113   do
2933 14 Nov 14 olle 1114   {
2933 14 Nov 14 olle 1115     var colspan;
2933 14 Nov 14 olle 1116     var headerText = currentYear;
2933 14 Nov 14 olle 1117     if (vt == "MONTH")
2933 14 Nov 14 olle 1118     {
2933 14 Nov 14 olle 1119       if (currentYear == startDate.getFullYear())
2933 14 Nov 14 olle 1120       {
2933 14 Nov 14 olle 1121         colspan =  11-startDate.getMonth()+1;
2933 14 Nov 14 olle 1122         if (endDate.getFullYear() == currentYear)
2933 14 Nov 14 olle 1123         {
2933 14 Nov 14 olle 1124           colspan = colspan - (11-endDate.getMonth());
2933 14 Nov 14 olle 1125         }
2933 14 Nov 14 olle 1126       }
2933 14 Nov 14 olle 1127       else if (currentYear == endDate.getFullYear()) 
2933 14 Nov 14 olle 1128         colspan = endDate.getMonth()+1;
2933 14 Nov 14 olle 1129       else
2933 14 Nov 14 olle 1130         colspan = 12;
2933 14 Nov 14 olle 1131     }
2933 14 Nov 14 olle 1132     else if (vt == "WEEK")
2933 14 Nov 14 olle 1133     {  
2933 14 Nov 14 olle 1134       if (startDate.getFullYear() == endDate.getFullYear())
2933 14 Nov 14 olle 1135       {
2933 14 Nov 14 olle 1136         colspan = numCols;
2933 14 Nov 14 olle 1137       }
2933 14 Nov 14 olle 1138       else if (currentYear == startDate.getFullYear())
2933 14 Nov 14 olle 1139       {
2933 14 Nov 14 olle 1140         var startWeek = getISOWeekNumber(startDate);
2933 14 Nov 14 olle 1141         var lastDay = new Date(startDate.getFullYear(), 11, 31);
2933 14 Nov 14 olle 1142         var endWeek = getISOWeekNumber(lastDay);
2933 14 Nov 14 olle 1143         if (endWeek == 1)
2933 14 Nov 14 olle 1144         {
2933 14 Nov 14 olle 1145           lastDay.setDate(lastDay.getDate()-7);
2933 14 Nov 14 olle 1146           endWeek = getISOWeekNumber(lastDay);
2933 14 Nov 14 olle 1147         }
2933 14 Nov 14 olle 1148         colspan = endWeek - startWeek +1;
2933 14 Nov 14 olle 1149       }
2933 14 Nov 14 olle 1150       else if (currentYear == endDate.getFullYear())
2933 14 Nov 14 olle 1151       {
2933 14 Nov 14 olle 1152         var endWeek = getISOWeekNumber(endDate);
2933 14 Nov 14 olle 1153         colspan = endWeek;
2933 14 Nov 14 olle 1154       }
2933 14 Nov 14 olle 1155       else
2933 14 Nov 14 olle 1156       {
2933 14 Nov 14 olle 1157         var dateInLastWeek = new Date(currentYear, 11, 31);
2933 14 Nov 14 olle 1158         var endWeek = getISOWeekNumber(dateInLastWeek);
2933 14 Nov 14 olle 1159         if (endWeek == 1)
2933 14 Nov 14 olle 1160         {
2933 14 Nov 14 olle 1161           dateInLastWeek.setDate(dateInLastWeek.getDate()-7);
2933 14 Nov 14 olle 1162           endWeek = getISOWeekNumber(dateInLastWeek);
2933 14 Nov 14 olle 1163         }
2933 14 Nov 14 olle 1164         colspan = endWeek;
2933 14 Nov 14 olle 1165       }                
2933 14 Nov 14 olle 1166     }
2933 14 Nov 14 olle 1167     else if (vt == "QUARTER")
2933 14 Nov 14 olle 1168     {
2933 14 Nov 14 olle 1169       if (currentYear == startDate.getFullYear())
2933 14 Nov 14 olle 1170       {
2933 14 Nov 14 olle 1171         if (startDate.getFullYear() == endDate.getFullYear())
2933 14 Nov 14 olle 1172         {
2933 14 Nov 14 olle 1173           colspan = Math.floor((endDate.getMonth()-startDate.getMonth())/3)+1;
2933 14 Nov 14 olle 1174         }
2933 14 Nov 14 olle 1175         else
2933 14 Nov 14 olle 1176         {
2933 14 Nov 14 olle 1177           colspan = Math.floor((11-startDate.getMonth())/3) +1;
2933 14 Nov 14 olle 1178         }
2933 14 Nov 14 olle 1179       }
2933 14 Nov 14 olle 1180       else if(currentYear == endDate.getFullYear())
2933 14 Nov 14 olle 1181       {
2933 14 Nov 14 olle 1182         colspan = Math.floor(endDate.getMonth()/3)+1;
2933 14 Nov 14 olle 1183       }
2933 14 Nov 14 olle 1184       else 
2933 14 Nov 14 olle 1185       {
2933 14 Nov 14 olle 1186         colspan = 4;
2933 14 Nov 14 olle 1187       }
2933 14 Nov 14 olle 1188     }
2933 14 Nov 14 olle 1189     else if (vt == "YEAR")
2933 14 Nov 14 olle 1190     {
2933 14 Nov 14 olle 1191       colspan = 1;        
2933 14 Nov 14 olle 1192     }
2933 14 Nov 14 olle 1193     columnCounter += colspan;            
2933 14 Nov 14 olle 1194     subHeaderRowYear.appendChild(getTableCellElement(headerText, 'reportsubheader', colspan));
2933 14 Nov 14 olle 1195   }while(!(++currentYear>endDate.getFullYear()));
2933 14 Nov 14 olle 1196 }
2933 14 Nov 14 olle 1197
2933 14 Nov 14 olle 1198 function addDataRowsToTable(report, reportTable)
2933 14 Nov 14 olle 1199 {
2933 14 Nov 14 olle 1200   var fdString = report.beginDate;
2933 14 Nov 14 olle 1201   var ldString = report.endDate;
2933 14 Nov 14 olle 1202   var psdString = report.periodBeginDate;
2933 14 Nov 14 olle 1203   var startDate = new Date();
2933 14 Nov 14 olle 1204   startDate.setYear(fdString.substr(0,4));
2933 14 Nov 14 olle 1205   startDate.setMonth(fdString.substr(4,2)-1);
2933 14 Nov 14 olle 1206   startDate.setDate(fdString.substr(6));
2933 14 Nov 14 olle 1207   var endDate = new Date();
2933 14 Nov 14 olle 1208   endDate.setYear(ldString.substr(0,4));
2933 14 Nov 14 olle 1209   endDate.setMonth(ldString.substr(4,2)-1);
2933 14 Nov 14 olle 1210   endDate.setDate(ldString.substr(6));
2933 14 Nov 14 olle 1211   var periodStartDate = new Date();
2933 14 Nov 14 olle 1212   periodStartDate.setYear(psdString.substr(0,4));
2933 14 Nov 14 olle 1213   periodStartDate.setMonth(psdString.substr(4,2)-1);
2933 14 Nov 14 olle 1214   periodStartDate.setDate(psdString.substr(6));
2933 14 Nov 14 olle 1215   var viewType = report.viewType;    
2933 14 Nov 14 olle 1216   var sites = report.sites;    
2933 14 Nov 14 olle 1217   var statistics = report.statistics;
2933 14 Nov 14 olle 1218   unknownCreation = statistics.noDate;
2933 14 Nov 14 olle 1219   unknownSite = statistics.unknownSite;
2933 14 Nov 14 olle 1220   unknownPatientSite = statistics.unknownPatientSite;
2933 14 Nov 14 olle 1221   for (var siteNo = 0; siteNo < sites.length; siteNo++)
2933 14 Nov 14 olle 1222   {
2933 14 Nov 14 olle 1223     var site = sites[siteNo];
2933 14 Nov 14 olle 1224     var siteName = site.name;    
2933 14 Nov 14 olle 1225     var year = site.startDate.substr(0,4);
2933 14 Nov 14 olle 1226     var month = site.startDate.substr(5,2);
2933 14 Nov 14 olle 1227     var date = site.startDate.substr(8,2);      
2933 14 Nov 14 olle 1228     var siteStartDate = new Date(year, month-1, date);
2933 14 Nov 14 olle 1229     
2933 14 Nov 14 olle 1230     var siteData = statistics[site.prefix];
2933 14 Nov 14 olle 1231     var siteLatestDate = siteData['latestDateKey'];
2933 14 Nov 14 olle 1232     var siteLatestDateStr = '????-??-??';
2933 14 Nov 14 olle 1233     if (siteLatestDate != null)
2933 14 Nov 14 olle 1234     {
2933 14 Nov 14 olle 1235       var siteLatestDateYear = siteLatestDate.substr(0,4);
2933 14 Nov 14 olle 1236       var siteLatestDateMonth = siteLatestDate.substr(4,2);
2933 14 Nov 14 olle 1237       var siteLatestDateDate = siteLatestDate.substr(6,2);
2933 14 Nov 14 olle 1238       siteLatestDateStr = siteLatestDateYear + '-' + siteLatestDateMonth + '-' + siteLatestDateDate;
2933 14 Nov 14 olle 1239     }
2933 14 Nov 14 olle 1240     var tableRow = document.createElement('tr');
2933 14 Nov 14 olle 1241     var tableCol = getTableCellElement(siteName, 'rowtitle');
2933 14 Nov 14 olle 1242     tableRow.appendChild(tableCol);
2933 14 Nov 14 olle 1243     tableRow.appendChild(getTableCellElement(year+'-'+(month)+'-'+date, 'reportdata'));
2933 14 Nov 14 olle 1244     tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
2933 14 Nov 14 olle 1245     var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());      
2933 14 Nov 14 olle 1246     var columnCounter = 0;
2933 14 Nov 14 olle 1247     do
2933 14 Nov 14 olle 1248     {  
2933 14 Nov 14 olle 1249       var data = 0;
2933 14 Nov 14 olle 1250       var keyIndex;
2933 14 Nov 14 olle 1251       var yearIndex = currentDate.getFullYear();
2933 14 Nov 14 olle 1252       
2933 14 Nov 14 olle 1253       if (viewType == 'YEAR')
2933 14 Nov 14 olle 1254       {
2933 14 Nov 14 olle 1255         keyIndex = yearIndex;
2933 14 Nov 14 olle 1256         if (siteData != null)
2933 14 Nov 14 olle 1257         {
2933 14 Nov 14 olle 1258           if (siteData[keyIndex] != null) data = siteData[keyIndex];
2933 14 Nov 14 olle 1259         }
2933 14 Nov 14 olle 1260         // Initialize data columns before site start date to empty string
2933 14 Nov 14 olle 1261         if ( (currentDate.getFullYear() < siteStartDate.getFullYear()))
2933 14 Nov 14 olle 1262         {
2933 14 Nov 14 olle 1263           data = '';
2933 14 Nov 14 olle 1264         }
2933 14 Nov 14 olle 1265         currentDate.setFullYear(currentDate.getFullYear()+1);
2933 14 Nov 14 olle 1266       }
2933 14 Nov 14 olle 1267       else if (viewType == 'QUARTER')
2933 14 Nov 14 olle 1268       {
2933 14 Nov 14 olle 1269         var qIndex = Math.floor(currentDate.getMonth()/3) + 1;
2933 14 Nov 14 olle 1270         var startQuarter = Math.floor(siteStartDate.getMonth()/3)+1;
2933 14 Nov 14 olle 1271         keyIndex = yearIndex + '' + qIndex;
2933 14 Nov 14 olle 1272         if (siteData != null)
2933 14 Nov 14 olle 1273         {
2933 14 Nov 14 olle 1274           if (siteData[keyIndex] != null) data = siteData[keyIndex];            
2933 14 Nov 14 olle 1275         }          
2933 14 Nov 14 olle 1276         // Initialize data columns before site start date to empty string
2933 14 Nov 14 olle 1277         if ( (currentDate.getFullYear() < siteStartDate.getFullYear()) ||
2933 14 Nov 14 olle 1278              (currentDate.getFullYear() == siteStartDate.getFullYear() && qIndex < startQuarter))
2933 14 Nov 14 olle 1279         {
2933 14 Nov 14 olle 1280           data = '';
2933 14 Nov 14 olle 1281         }
2933 14 Nov 14 olle 1282         currentDate.setMonth(currentDate.getMonth()+3);          
2933 14 Nov 14 olle 1283       }
2933 14 Nov 14 olle 1284       else if (viewType == 'MONTH')
2933 14 Nov 14 olle 1285       {
2933 14 Nov 14 olle 1286         var monthIndex = currentDate.getMonth()+1;
2933 14 Nov 14 olle 1287         var rowFill = monthIndex < 10 ? '0' : '';
2933 14 Nov 14 olle 1288         keyIndex = yearIndex + rowFill + monthIndex;
2933 14 Nov 14 olle 1289         if (siteData != null)
2933 14 Nov 14 olle 1290         {
2933 14 Nov 14 olle 1291           if (siteData[keyIndex] != null) data = siteData[keyIndex];
2933 14 Nov 14 olle 1292         }
2933 14 Nov 14 olle 1293         // Initialize data columns before site start date to empty string
2933 14 Nov 14 olle 1294         if ( (currentDate.getFullYear() < siteStartDate.getFullYear()) ||
2933 14 Nov 14 olle 1295              (currentDate.getFullYear() == siteStartDate.getFullYear() && (monthIndex-1) < siteStartDate.getMonth()))
2933 14 Nov 14 olle 1296         {
2933 14 Nov 14 olle 1297           data = '';
2933 14 Nov 14 olle 1298         }
2933 14 Nov 14 olle 1299         currentDate.setMonth(currentDate.getMonth()+1);
2933 14 Nov 14 olle 1300       }
2933 14 Nov 14 olle 1301       else if (viewType == 'WEEK')
2933 14 Nov 14 olle 1302       {
2933 14 Nov 14 olle 1303         var weekIndex = getISOWeekNumber(currentDate);
2933 14 Nov 14 olle 1304         // Week number in year stored as yyyyww with leading 0 if needed
2933 14 Nov 14 olle 1305         if (weekIndex < 10)
2933 14 Nov 14 olle 1306         {
2933 14 Nov 14 olle 1307           keyIndex = yearIndex + '0' + weekIndex;
2933 14 Nov 14 olle 1308         }
2933 14 Nov 14 olle 1309         else
2933 14 Nov 14 olle 1310         {
2933 14 Nov 14 olle 1311           keyIndex = yearIndex + '' + weekIndex;
2933 14 Nov 14 olle 1312         }
2933 14 Nov 14 olle 1313         if (siteData != null)
2933 14 Nov 14 olle 1314         {
2933 14 Nov 14 olle 1315           if (siteData[keyIndex] != null) data = siteData[keyIndex];
2933 14 Nov 14 olle 1316         }
2933 14 Nov 14 olle 1317         // Initialize data columns before site start date to empty string
2933 14 Nov 14 olle 1318         //
2933 14 Nov 14 olle 1319         // Note: ISO week numbers are tricky in their short form (without being coupled to a year),
2933 14 Nov 14 olle 1320         // since days in different years may lie in the same week, and days at the start of
2933 14 Nov 14 olle 1321         // a year may have week number 52 or 53 of the previous year and days at the end of
2933 14 Nov 14 olle 1322         // a year may have week number 01 of the next year.
2933 14 Nov 14 olle 1323         // Example: Monday 2012-01-02 has week number 2012-01, Monday 2012-12-31 has week number 2013-01
2933 14 Nov 14 olle 1324         // If current date is before site start date - 6 days, it is in a previous week
2933 14 Nov 14 olle 1325         // If current date is within site start date +/- 6 days and not in the same week, check dates
2933 14 Nov 14 olle 1326         // (just checking week numbers in the last case leads to e.g. 2012-12-30 (w52) > 2012-12-31 (w01))
2933 14 Nov 14 olle 1327         //
2933 14 Nov 14 olle 1328         if (currentDate.getTime() < siteStartDate.getTime() - 6*24*3600*1000 ||
2933 14 Nov 14 olle 1329             currentDate.getTime() < siteStartDate.getTime() + 6*24*3600*1000 &&
2933 14 Nov 14 olle 1330                getISOWeekNumber(currentDate) != getISOWeekNumber(siteStartDate) &&
2933 14 Nov 14 olle 1331                currentDate < siteStartDate)
2933 14 Nov 14 olle 1332         {
2933 14 Nov 14 olle 1333           data = '';
2933 14 Nov 14 olle 1334         }
2933 14 Nov 14 olle 1335         currentDate.setDate(currentDate.getDate()+7);
2933 14 Nov 14 olle 1336       }
2933 14 Nov 14 olle 1337       
2933 14 Nov 14 olle 1338       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2933 14 Nov 14 olle 1339       columnCounter++;        
2933 14 Nov 14 olle 1340     } while (columnCounter < numCols)
2933 14 Nov 14 olle 1341     // Add column with sample sum for site for the selected time period
2933 14 Nov 14 olle 1342     var siteSum = 0;
2933 14 Nov 14 olle 1343     if (siteData != null)
2933 14 Nov 14 olle 1344     {
2933 14 Nov 14 olle 1345       var sumSiteKey = 'sumSiteKey';
2933 14 Nov 14 olle 1346       if (siteData[sumSiteKey] != null)
2933 14 Nov 14 olle 1347       {
2933 14 Nov 14 olle 1348         siteSum = siteData[sumSiteKey];
2933 14 Nov 14 olle 1349       }
2933 14 Nov 14 olle 1350     }
2933 14 Nov 14 olle 1351     tableRow.appendChild(getTableCellElement(siteSum, 'rowsummary'));
2933 14 Nov 14 olle 1352     // Add column with total number of samples for site, regardless of creation date
2933 14 Nov 14 olle 1353     var siteTotal = 0;
2933 14 Nov 14 olle 1354     if (siteData != null)
2933 14 Nov 14 olle 1355     {
2933 14 Nov 14 olle 1356       var totalSiteKey = 'totalSiteKey';
2933 14 Nov 14 olle 1357       if (siteData[totalSiteKey] != null)
2933 14 Nov 14 olle 1358       {
2933 14 Nov 14 olle 1359         siteTotal = siteData[totalSiteKey];
2933 14 Nov 14 olle 1360       }
2933 14 Nov 14 olle 1361     }
2933 14 Nov 14 olle 1362     tableRow.appendChild(getTableCellElement(siteTotal, 'rowsummary'));
2933 14 Nov 14 olle 1363     reportTable.appendChild(tableRow);
2933 14 Nov 14 olle 1364   }
2933 14 Nov 14 olle 1365 }
2933 14 Nov 14 olle 1366
2933 14 Nov 14 olle 1367 function createSortedPeriodArray(report, numberOfColumns)
2933 14 Nov 14 olle 1368 {
2933 14 Nov 14 olle 1369   var psdString = report.periodBeginDate;
2933 14 Nov 14 olle 1370   var periodStartDate = new Date();
2933 14 Nov 14 olle 1371   periodStartDate.setYear(psdString.substr(0,4));
2933 14 Nov 14 olle 1372   periodStartDate.setMonth(psdString.substr(4,2)-1);
2933 14 Nov 14 olle 1373   periodStartDate.setDate(psdString.substr(6));
2933 14 Nov 14 olle 1374   var viewType = report.viewType;    
2933 14 Nov 14 olle 1375   var sortedPeriodArray = Array(numberOfColumns);
2933 14 Nov 14 olle 1376   var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());      
2933 14 Nov 14 olle 1377   var columnCounter = 0;
2933 14 Nov 14 olle 1378   do
2933 14 Nov 14 olle 1379   {  
2933 14 Nov 14 olle 1380     var keyIndex;
2933 14 Nov 14 olle 1381     var yearIndex = currentDate.getFullYear();
2933 14 Nov 14 olle 1382       
2933 14 Nov 14 olle 1383     if (viewType == 'YEAR')
2933 14 Nov 14 olle 1384     {
2933 14 Nov 14 olle 1385       keyIndex = yearIndex;
2933 14 Nov 14 olle 1386       currentDate.setFullYear(currentDate.getFullYear()+1);
2933 14 Nov 14 olle 1387     }
2933 14 Nov 14 olle 1388     else if (viewType == 'QUARTER')
2933 14 Nov 14 olle 1389     {
2933 14 Nov 14 olle 1390       var qIndex = Math.floor(currentDate.getMonth()/3) + 1;
2933 14 Nov 14 olle 1391       keyIndex = yearIndex + '' + qIndex;
2933 14 Nov 14 olle 1392       currentDate.setMonth(currentDate.getMonth()+3);          
2933 14 Nov 14 olle 1393     }
2933 14 Nov 14 olle 1394     else if (viewType == 'MONTH')
2933 14 Nov 14 olle 1395     {
2933 14 Nov 14 olle 1396       var monthIndex = currentDate.getMonth()+1;
2933 14 Nov 14 olle 1397       var rowFill = monthIndex < 10 ? '0' : '';
2933 14 Nov 14 olle 1398       keyIndex = yearIndex + rowFill + monthIndex;
2933 14 Nov 14 olle 1399       currentDate.setMonth(currentDate.getMonth()+1);
2933 14 Nov 14 olle 1400     }
2933 14 Nov 14 olle 1401     else if (viewType == 'WEEK')
2933 14 Nov 14 olle 1402     {
2933 14 Nov 14 olle 1403       var weekIndex = getISOWeekNumber(currentDate);
2933 14 Nov 14 olle 1404       // Week number in year stored as yyyyww with leading 0 if needed
2933 14 Nov 14 olle 1405       if (weekIndex < 10)
2933 14 Nov 14 olle 1406       {
2933 14 Nov 14 olle 1407         keyIndex = yearIndex + '0' + weekIndex;
2933 14 Nov 14 olle 1408       }
2933 14 Nov 14 olle 1409       else
2933 14 Nov 14 olle 1410       {
2933 14 Nov 14 olle 1411         keyIndex = yearIndex + '' + weekIndex;
2933 14 Nov 14 olle 1412       }
2933 14 Nov 14 olle 1413       currentDate.setDate(currentDate.getDate()+7);
2933 14 Nov 14 olle 1414     }
2933 14 Nov 14 olle 1415     sortedPeriodArray[columnCounter] = keyIndex;
2933 14 Nov 14 olle 1416     columnCounter++;        
2933 14 Nov 14 olle 1417   } while (columnCounter < numberOfColumns)
2933 14 Nov 14 olle 1418   return sortedPeriodArray;
2933 14 Nov 14 olle 1419 }
2933 14 Nov 14 olle 1420
2933 14 Nov 14 olle 1421 function getReportTable()
2933 14 Nov 14 olle 1422 {
2933 14 Nov 14 olle 1423     var reportTable = document.createElement('table');
2933 14 Nov 14 olle 1424     reportTable.setAttribute('class','reporttable');
2933 14 Nov 14 olle 1425     reportTable.setAttribute('border','1');      
2933 14 Nov 14 olle 1426     return reportTable;
2933 14 Nov 14 olle 1427 }
2933 14 Nov 14 olle 1428
2933 14 Nov 14 olle 1429 function getTableCellElement(text, clazz, colspan, rowspan)
2933 14 Nov 14 olle 1430 {
2933 14 Nov 14 olle 1431   var cellElement = document.createElement('td');
2933 14 Nov 14 olle 1432   text = new String(text);    
2933 14 Nov 14 olle 1433   var textArray = text.split("\n");    
2933 14 Nov 14 olle 1434   if (textArray.length > 1)
2933 14 Nov 14 olle 1435   {  
2933 14 Nov 14 olle 1436     for (var i=0;i<textArray.length;i++)
2933 14 Nov 14 olle 1437     {        
2933 14 Nov 14 olle 1438       if (i>0)cellElement.appendChild(document.createElement('br'));
2933 14 Nov 14 olle 1439       cellElement.appendChild(document.createTextNode(textArray[i]));
2933 14 Nov 14 olle 1440     }      
2933 14 Nov 14 olle 1441   }
2933 14 Nov 14 olle 1442   else
2933 14 Nov 14 olle 1443   {
2933 14 Nov 14 olle 1444     cellElement.appendChild(document.createTextNode(text));
2933 14 Nov 14 olle 1445   }
2933 14 Nov 14 olle 1446   cellElement.setAttribute('class', clazz);
2933 14 Nov 14 olle 1447   if (colspan != null) cellElement.setAttribute('colspan', colspan);
2933 14 Nov 14 olle 1448   if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
2933 14 Nov 14 olle 1449   
2933 14 Nov 14 olle 1450   return cellElement;
2933 14 Nov 14 olle 1451 }
2933 14 Nov 14 olle 1452
2933 14 Nov 14 olle 1453 function getListElement(itemText)
2933 14 Nov 14 olle 1454 {
2933 14 Nov 14 olle 1455   var listElement = document.createElement('li');
2933 14 Nov 14 olle 1456   var textNode = document.createTextNode(itemText);
2933 14 Nov 14 olle 1457   listElement.appendChild(textNode);
2933 14 Nov 14 olle 1458   return listElement;
2933 14 Nov 14 olle 1459 }
2933 14 Nov 14 olle 1460
2933 14 Nov 14 olle 1461 /**
2933 14 Nov 14 olle 1462  *  addHyphensToDateStr()
2933 14 Nov 14 olle 1463  *
2933 14 Nov 14 olle 1464  *  Adds hyphens to date string in yyyymmdd format to
2933 14 Nov 14 olle 1465  *  get yyyy-mm-dd format. If input string already contains
2933 14 Nov 14 olle 1466  *  hyphen(s), the input string is returned unchanged.
2933 14 Nov 14 olle 1467  *  If input string is null or empty, '????-??-??' is returned.
2933 14 Nov 14 olle 1468  *
2933 14 Nov 14 olle 1469  *  @param dateStr String Input date string in yyyy-mm-dd or yyyymmdd format.
2933 14 Nov 14 olle 1470  *  @return String Date string in yyyy-mm-dd format.
2933 14 Nov 14 olle 1471  */
2933 14 Nov 14 olle 1472 function addHyphensToDateString(dateStr)
2933 14 Nov 14 olle 1473 {
2933 14 Nov 14 olle 1474   var dateWithHyphensStr = '????-??-??';
2933 14 Nov 14 olle 1475   if (dateStr != null && dateStr != '')
2933 14 Nov 14 olle 1476   {
2933 14 Nov 14 olle 1477     // Check if input string already contains hyphen
2933 14 Nov 14 olle 1478     if (dateStr.indexOf("-") >= 0)
2933 14 Nov 14 olle 1479     {
2933 14 Nov 14 olle 1480       // Date already has hyphen(s)
2933 14 Nov 14 olle 1481       dateWithHyphensStr = dateStr;
2933 14 Nov 14 olle 1482     }
2933 14 Nov 14 olle 1483     else
2933 14 Nov 14 olle 1484     {
2933 14 Nov 14 olle 1485       // Date in yyyymmdd format
2933 14 Nov 14 olle 1486       var yearStr = dateStr.substr(0,4);
2933 14 Nov 14 olle 1487       var monthStr = dateStr.substr(4,2);
2933 14 Nov 14 olle 1488       var dayStr = dateStr.substr(6,2);      
2933 14 Nov 14 olle 1489       dateWithHyphensStr = yearStr + '-' + monthStr + '-' + dayStr;
2933 14 Nov 14 olle 1490     }
2933 14 Nov 14 olle 1491   }
2933 14 Nov 14 olle 1492   return dateWithHyphensStr;
2933 14 Nov 14 olle 1493 }
2933 14 Nov 14 olle 1494
2933 14 Nov 14 olle 1495 /**
2933 14 Nov 14 olle 1496  *  dateStrToDate()
2933 14 Nov 14 olle 1497  *
2933 14 Nov 14 olle 1498  *  Takes an input date string in yyyy-mm-dd or yyyymmdd format
2933 14 Nov 14 olle 1499  *  and returns a date corresponding to the date string.
2933 14 Nov 14 olle 1500  *  If input string is null or empty, null is returned.
2933 14 Nov 14 olle 1501  *
2933 14 Nov 14 olle 1502  *  @param dateStr String Input date string in yyyy-mm-dd or yyyymmdd format.
2933 14 Nov 14 olle 1503  *  @return Date Date corresponding to input date string.
2933 14 Nov 14 olle 1504  */
2933 14 Nov 14 olle 1505 function dateStrToDate(dateStr)
2933 14 Nov 14 olle 1506 {
2933 14 Nov 14 olle 1507   var date = null;
2933 14 Nov 14 olle 1508   if (dateStr != null && dateStr != '')
2933 14 Nov 14 olle 1509   {
2933 14 Nov 14 olle 1510     // Check if input string already contains hyphen
2933 14 Nov 14 olle 1511     if (dateStr.indexOf("-") >= 0)
2933 14 Nov 14 olle 1512     {
2933 14 Nov 14 olle 1513       // Date in yyyy-mm-dd format
2933 14 Nov 14 olle 1514       var yearStr = dateStr.substr(0,4);
2933 14 Nov 14 olle 1515       var monthStr = dateStr.substr(5,2);
2933 14 Nov 14 olle 1516       var dayStr = dateStr.substr(8,2);      
2933 14 Nov 14 olle 1517       var date = new Date(parseInt(yearStr, 10), parseInt(monthStr, 10)-1, parseInt(dayStr, 10));
2933 14 Nov 14 olle 1518     }
2933 14 Nov 14 olle 1519     else
2933 14 Nov 14 olle 1520     {
2933 14 Nov 14 olle 1521       // Date in yyyymmdd format
2933 14 Nov 14 olle 1522       var yearStr = dateStr.substr(0,4);
2933 14 Nov 14 olle 1523       var monthStr = dateStr.substr(4,2);
2933 14 Nov 14 olle 1524       var dayStr = dateStr.substr(6,2);      
2933 14 Nov 14 olle 1525       var date = new Date(parseInt(yearStr, 10), parseInt(monthStr, 10)-1, parseInt(dayStr, 10));
2933 14 Nov 14 olle 1526     }
2933 14 Nov 14 olle 1527   }
2933 14 Nov 14 olle 1528   return date;
2933 14 Nov 14 olle 1529 }
2933 14 Nov 14 olle 1530
2933 14 Nov 14 olle 1531 /*
2933 14 Nov 14 olle 1532  *  Get the ISO week number for a given date
2933 14 Nov 14 olle 1533  * 
2933 14 Nov 14 olle 1534  *  Based on code at http://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php
2933 14 Nov 14 olle 1535  *
2933 14 Nov 14 olle 1536  *  @param date String Input date to get ISO week number for.
2933 14 Nov 14 olle 1537  *  @return int ISO week number for input date.
2933 14 Nov 14 olle 1538  */
2933 14 Nov 14 olle 1539 function getISOWeekNumber(date)
2933 14 Nov 14 olle 1540 {
2933 14 Nov 14 olle 1541   tmpDate = new Date(date);
2933 14 Nov 14 olle 1542   tmpDate.setHours(0,0,0);
2933 14 Nov 14 olle 1543   // Set to nearest Thursday: current date + 4 - current day number
2933 14 Nov 14 olle 1544   // Make Sunday day number 7
2933 14 Nov 14 olle 1545   tmpDate.setDate(tmpDate.getDate() + 4 - (tmpDate.getDay() || 7));
2933 14 Nov 14 olle 1546   // Get first day of year
2933 14 Nov 14 olle 1547   var yearStart = new Date(tmpDate.getFullYear(), 0, 1);
2933 14 Nov 14 olle 1548   // Calculate full weeks to nearast Thursday (86400000 = 24*60*60*1000 number of ms in a day)
2933 14 Nov 14 olle 1549   var weekNo = Math.ceil(( ( (tmpDate - yearStart) / 86400000) + 1)/7);
2933 14 Nov 14 olle 1550   return weekNo;
2933 14 Nov 14 olle 1551 }
2933 14 Nov 14 olle 1552
2933 14 Nov 14 olle 1553
2933 14 Nov 14 olle 1554 function getProjectFocusFilterDisplayText(projectFocusFilter)
2933 14 Nov 14 olle 1555 {
2933 14 Nov 14 olle 1556   var projectFocusFilterDisplayText = projectFocusFilter;
2933 14 Nov 14 olle 1557   if (projectFocusFilter == 'melanoma')
2933 14 Nov 14 olle 1558   {
2933 14 Nov 14 olle 1559     projectFocusFilterDisplayText = 'Melanoma';
2933 14 Nov 14 olle 1560   }
2933 14 Nov 14 olle 1561   else if (projectFocusFilter == 'lungcancer')
2933 14 Nov 14 olle 1562   {
2933 14 Nov 14 olle 1563     projectFocusFilterDisplayText = 'Lung cancer';
2933 14 Nov 14 olle 1564   }
3058 19 Dec 14 olle 1565   else if (projectFocusFilter == 'coloncancer')
3058 19 Dec 14 olle 1566   {
3058 19 Dec 14 olle 1567     projectFocusFilterDisplayText = 'Colon cancer';
3058 19 Dec 14 olle 1568   }
3139 16 Feb 15 olle 1569   else if (projectFocusFilter == 'GIST')
3139 16 Feb 15 olle 1570   {
3139 16 Feb 15 olle 1571     projectFocusFilterDisplayText = 'GIST (Gastrointestinal stromal tumour)';
3139 16 Feb 15 olle 1572   }
4196 31 Oct 16 olle 1573   else if (projectFocusFilter == 'breastcancer')
4196 31 Oct 16 olle 1574   {
4196 31 Oct 16 olle 1575     projectFocusFilterDisplayText = 'Breast cancer';
4196 31 Oct 16 olle 1576   }
2933 14 Nov 14 olle 1577   else if (projectFocusFilter == '')
2933 14 Nov 14 olle 1578   {
2933 14 Nov 14 olle 1579     projectFocusFilterDisplayText = 'unknown';
2933 14 Nov 14 olle 1580   }
2933 14 Nov 14 olle 1581   return projectFocusFilterDisplayText;
2933 14 Nov 14 olle 1582 }