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

Code
Comments
Other
Rev Date Author Line
2611 29 Aug 14 nicklas 1 var Report = function()
2611 29 Aug 14 nicklas 2 {
2611 29 Aug 14 nicklas 3   var report = {};
2656 11 Sep 14 nicklas 4   var debug = 0;
2611 29 Aug 14 nicklas 5   
2611 29 Aug 14 nicklas 6   var periodIsValid = true;
2611 29 Aug 14 nicklas 7   
2611 29 Aug 14 nicklas 8   report.initPage = function()
2611 29 Aug 14 nicklas 9   {
2611 29 Aug 14 nicklas 10     // Step 1
2611 29 Aug 14 nicklas 11
2611 29 Aug 14 nicklas 12     // Step 2
2611 29 Aug 14 nicklas 13     Events.addEventHandler('step-2', 'wizard-initialize', report.initializeStep2);
2611 29 Aug 14 nicklas 14     Events.addEventHandler('step-2', 'wizard-validate', report.validateStep2);
2611 29 Aug 14 nicklas 15     Events.addEventHandler('fromdate', 'blur', report.dateOnChange)
2611 29 Aug 14 nicklas 16     Events.addEventHandler('todate', 'blur', report.dateOnChange)
2611 29 Aug 14 nicklas 17     Events.addEventHandler('sampletype', 'change', report.sampleTypeOnChange);
2611 29 Aug 14 nicklas 18     Events.addEventHandler('tablealternatives', 'change', report.tableAlternativesOnChange);
2611 29 Aug 14 nicklas 19     
2611 29 Aug 14 nicklas 20     // Final registration
2611 29 Aug 14 nicklas 21     Events.addEventHandler('wizard', 'wizard-submit', report.submit);
2611 29 Aug 14 nicklas 22     Events.addEventHandler('printButton', 'click', report.printVersion);
2611 29 Aug 14 nicklas 23
2611 29 Aug 14 nicklas 24     // Navigation
2611 29 Aug 14 nicklas 25     Buttons.addClickHandler('gocancel', Wizard.restartWizard);
2611 29 Aug 14 nicklas 26     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2611 29 Aug 14 nicklas 27     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2611 29 Aug 14 nicklas 28     Buttons.addClickHandler('gocreate', Wizard.goRegister);
2611 29 Aug 14 nicklas 29
2611 29 Aug 14 nicklas 30     Doc.show('step-1');
2611 29 Aug 14 nicklas 31     Doc.show('gonext');
2611 29 Aug 14 nicklas 32   }
2611 29 Aug 14 nicklas 33   
2611 29 Aug 14 nicklas 34   report.initializeStep2 = function()
2611 29 Aug 14 nicklas 35   {
2611 29 Aug 14 nicklas 36     var frm = document.forms['reggie'];
2611 29 Aug 14 nicklas 37     Wizard.setCurrentStep(2);
2611 29 Aug 14 nicklas 38     Doc.show('gocancel');
2611 29 Aug 14 nicklas 39     Doc.show('gocreate');
2611 29 Aug 14 nicklas 40     var reportType = frm.reporttype.value;
2611 29 Aug 14 nicklas 41     
2611 29 Aug 14 nicklas 42     // Hide all parameter fiels
2611 29 Aug 14 nicklas 43     Doc.hide('report-period');
2611 29 Aug 14 nicklas 44     Doc.hide('view-type');
2611 29 Aug 14 nicklas 45     Doc.hide('sample-type');
2611 29 Aug 14 nicklas 46     Doc.hide('table-alternatives');
2611 29 Aug 14 nicklas 47     Doc.hide('blood-filter');
2611 29 Aug 14 nicklas 48
2611 29 Aug 14 nicklas 49     // Re-enable base on report type
2611 29 Aug 14 nicklas 50     if (reportType == 'samplecount')
2611 29 Aug 14 nicklas 51     {
2611 29 Aug 14 nicklas 52       Doc.show('report-period');
2611 29 Aug 14 nicklas 53       Doc.show('view-type');
2611 29 Aug 14 nicklas 54       Doc.show('sample-type');
2611 29 Aug 14 nicklas 55       Doc.show('table-alternatives');
2611 29 Aug 14 nicklas 56       Doc.show('blood-filter');
2611 29 Aug 14 nicklas 57       frm.tablealternatives.disabled = true;
2611 29 Aug 14 nicklas 58       frm.bloodsamplefilter.disabled = true;
2611 29 Aug 14 nicklas 59     }
2611 29 Aug 14 nicklas 60     else if (reportType == 'consentcount')
2611 29 Aug 14 nicklas 61     {
2611 29 Aug 14 nicklas 62       Doc.show('report-period');
2611 29 Aug 14 nicklas 63     }
2611 29 Aug 14 nicklas 64     else if (reportType == 'patientcount')
2611 29 Aug 14 nicklas 65     {
2611 29 Aug 14 nicklas 66       Doc.show('report-period');
2611 29 Aug 14 nicklas 67       Doc.show('view-type');
2611 29 Aug 14 nicklas 68     }
2611 29 Aug 14 nicklas 69     else if (reportType == 'overviewreport')
2611 29 Aug 14 nicklas 70     {
2611 29 Aug 14 nicklas 71       Doc.show('report-period');
2611 29 Aug 14 nicklas 72       Doc.show('blood-filter');
2611 29 Aug 14 nicklas 73     }
2611 29 Aug 14 nicklas 74     else if (reportType == 'missingsampledatareport')
2611 29 Aug 14 nicklas 75     {
2611 29 Aug 14 nicklas 76       Doc.show('sample-type');
2611 29 Aug 14 nicklas 77       Doc.show('blood-filter');
2611 29 Aug 14 nicklas 78       frm.bloodsamplefilter.disabled = true;
2611 29 Aug 14 nicklas 79     }
2611 29 Aug 14 nicklas 80
2611 29 Aug 14 nicklas 81     frm.fromdate.focus();
2611 29 Aug 14 nicklas 82   }
2611 29 Aug 14 nicklas 83   
2611 29 Aug 14 nicklas 84   report.validateStep2 = function(event)
2611 29 Aug 14 nicklas 85   {
2611 29 Aug 14 nicklas 86     if (!periodIsValid) event.preventDefault();
2611 29 Aug 14 nicklas 87   }
2611 29 Aug 14 nicklas 88
2611 29 Aug 14 nicklas 89   report.dateOnChange = function()
2611 29 Aug 14 nicklas 90   {
2611 29 Aug 14 nicklas 91     var frm = document.forms['reggie'];    
2611 29 Aug 14 nicklas 92     var fromDate = frm.fromdate.value;
2611 29 Aug 14 nicklas 93     var toDate = frm.todate.value;
2611 29 Aug 14 nicklas 94     
2611 29 Aug 14 nicklas 95     periodIsValid = false;
2611 29 Aug 14 nicklas 96     Wizard.setInputStatus('period');
2611 29 Aug 14 nicklas 97
2611 29 Aug 14 nicklas 98     if (fromDate != '')
2611 29 Aug 14 nicklas 99     {
2611 29 Aug 14 nicklas 100       fromDate = Reggie.autoFillDate(fromDate, true);
2611 29 Aug 14 nicklas 101       frm.fromdate.value = fromDate;      
2611 29 Aug 14 nicklas 102       if (!Dates.isDate(fromDate, 'yyyyMMdd'))
2611 29 Aug 14 nicklas 103       {
2611 29 Aug 14 nicklas 104         Wizard.setInputStatus('period', 'invalid', 'Not a valid from-date');
2611 29 Aug 14 nicklas 105         return;
2611 29 Aug 14 nicklas 106       }
2611 29 Aug 14 nicklas 107     }
2611 29 Aug 14 nicklas 108
2611 29 Aug 14 nicklas 109     if (toDate != '')
2611 29 Aug 14 nicklas 110     {
2611 29 Aug 14 nicklas 111       toDate = Reggie.autoFillDate(toDate, true);
2611 29 Aug 14 nicklas 112       frm.todate.value = toDate;      
2611 29 Aug 14 nicklas 113       if (!Dates.isDate(toDate, 'yyyyMMdd'))
2611 29 Aug 14 nicklas 114       {
2611 29 Aug 14 nicklas 115         Wizard.setInputStatus('period', 'invalid', 'Not a valid to-date');
2611 29 Aug 14 nicklas 116         return;
2611 29 Aug 14 nicklas 117       }
2611 29 Aug 14 nicklas 118     }
2611 29 Aug 14 nicklas 119     
2611 29 Aug 14 nicklas 120     if (toDate && fromDate)
2611 29 Aug 14 nicklas 121     {
2611 29 Aug 14 nicklas 122       if (fromDate > toDate)
2611 29 Aug 14 nicklas 123       {
2611 29 Aug 14 nicklas 124         Wizard.setInputStatus('period', 'invalid', 'Invalid period')
2611 29 Aug 14 nicklas 125         return;
2611 29 Aug 14 nicklas 126       }      
2611 29 Aug 14 nicklas 127     }
2611 29 Aug 14 nicklas 128     
2611 29 Aug 14 nicklas 129     Wizard.setInputStatus('period', 'valid');
2611 29 Aug 14 nicklas 130     periodIsValid = true;
2611 29 Aug 14 nicklas 131   }
2611 29 Aug 14 nicklas 132
2611 29 Aug 14 nicklas 133   report.sampleTypeOnChange = function()
2611 29 Aug 14 nicklas 134   {
2611 29 Aug 14 nicklas 135     var frm = document.forms['reggie'];
2611 29 Aug 14 nicklas 136     var reportType = frm.reporttype.value;
2611 29 Aug 14 nicklas 137     var sampleType = frm.sampletype.value;
2611 29 Aug 14 nicklas 138     var tableAlternatives = frm.tablealternatives.value;
2611 29 Aug 14 nicklas 139     
2611 29 Aug 14 nicklas 140     if (sampleType == 'blood')
2611 29 Aug 14 nicklas 141     {
2611 29 Aug 14 nicklas 142       if (reportType == 'samplecount')
2611 29 Aug 14 nicklas 143       {
2611 29 Aug 14 nicklas 144         // Enable table alternatives menu
2611 29 Aug 14 nicklas 145         frm.tablealternatives.disabled = false;
2611 29 Aug 14 nicklas 146         // In principal this case should not exist when sample type has just been changed to 'blood'
2611 29 Aug 14 nicklas 147         if (tableAlternatives == 'blood_sample_table_with_filter')
2611 29 Aug 14 nicklas 148         {
2611 29 Aug 14 nicklas 149           // Enable blood sample type filter menu
2611 29 Aug 14 nicklas 150           frm.bloodsamplefilter.disabled = false;
2611 29 Aug 14 nicklas 151         }
2611 29 Aug 14 nicklas 152       }
2611 29 Aug 14 nicklas 153       else
2611 29 Aug 14 nicklas 154       {
2611 29 Aug 14 nicklas 155         // Enable blood sample type filter menu
2611 29 Aug 14 nicklas 156         frm.bloodsamplefilter.disabled = false;
2611 29 Aug 14 nicklas 157       }
2611 29 Aug 14 nicklas 158     }
2611 29 Aug 14 nicklas 159     else
2611 29 Aug 14 nicklas 160     {
2611 29 Aug 14 nicklas 161       // Disable table alternatives menu and reset option
2611 29 Aug 14 nicklas 162       frm.tablealternatives.selectedIndex = 0;
2611 29 Aug 14 nicklas 163       frm.tablealternatives.disabled = true;
2611 29 Aug 14 nicklas 164       // Disable blood sample type filter menu and reset option
2611 29 Aug 14 nicklas 165       frm.bloodsamplefilter.selectedIndex = 0;
2611 29 Aug 14 nicklas 166       frm.bloodsamplefilter.disabled = true;
2611 29 Aug 14 nicklas 167     }
2611 29 Aug 14 nicklas 168   }
2611 29 Aug 14 nicklas 169
2611 29 Aug 14 nicklas 170   report.tableAlternativesOnChange = function()
2611 29 Aug 14 nicklas 171   {
2611 29 Aug 14 nicklas 172     var frm = document.forms['reggie'];
2611 29 Aug 14 nicklas 173     var sampleType = frm.sampletype.value;
2611 29 Aug 14 nicklas 174     var tableAlternatives = frm.tablealternatives.value;
2611 29 Aug 14 nicklas 175     if (sampleType == 'blood' && tableAlternatives == 'blood_sample_table_with_filter')
2611 29 Aug 14 nicklas 176     {
2611 29 Aug 14 nicklas 177       // Enable blood sample type filter menu
2611 29 Aug 14 nicklas 178       frm.bloodsamplefilter.disabled = false;
2611 29 Aug 14 nicklas 179     }
2611 29 Aug 14 nicklas 180     else
2611 29 Aug 14 nicklas 181     {
2611 29 Aug 14 nicklas 182       // Disable blood sample type filter menu and reset option
2611 29 Aug 14 nicklas 183       frm.bloodsamplefilter.selectedIndex = 0;
2611 29 Aug 14 nicklas 184       frm.bloodsamplefilter.disabled = true;
2611 29 Aug 14 nicklas 185     }
2611 29 Aug 14 nicklas 186   }
2611 29 Aug 14 nicklas 187   
2611 29 Aug 14 nicklas 188   report.submit = function()
2611 29 Aug 14 nicklas 189   {
2611 29 Aug 14 nicklas 190     var frm = document.forms['reggie'];    
2611 29 Aug 14 nicklas 191
2611 29 Aug 14 nicklas 192     var url = '../SampleReport.servlet?ID='+App.getSessionId();
2611 29 Aug 14 nicklas 193     url += '&cmd='+frm.reporttype.value;
2611 29 Aug 14 nicklas 194     url += '&fdate='+frm.fromdate.value;
2611 29 Aug 14 nicklas 195     url += '&tdate='+frm.todate.value;
2611 29 Aug 14 nicklas 196     url += '&vtype='+frm.viewtype.value;
2611 29 Aug 14 nicklas 197     url += '&stype='+frm.sampletype.value;
2611 29 Aug 14 nicklas 198     url += '&tablealternatives='+frm.tablealternatives.value;
2611 29 Aug 14 nicklas 199     url += '&bloodsamplefilter='+frm.bloodsamplefilter.value;
2611 29 Aug 14 nicklas 200
3911 02 May 16 nicklas 201     Wizard.showLoadingAnimation('Generating report...', frm.reporttype.value+'-progress');
2611 29 Aug 14 nicklas 202     Wizard.asyncJsonRequest(url, report.onReportGenerated);
2611 29 Aug 14 nicklas 203   }
2611 29 Aug 14 nicklas 204   
2611 29 Aug 14 nicklas 205   report.onReportGenerated = function(response)
2611 29 Aug 14 nicklas 206   {
2611 29 Aug 14 nicklas 207     var reportData = response.report;
2611 29 Aug 14 nicklas 208     var permissionDeniedForPatientName = reportData.permissionDeniedForPatientName;
2611 29 Aug 14 nicklas 209     var permissionDeniedForPad = reportData.permissionDeniedForPad;
2611 29 Aug 14 nicklas 210   
2611 29 Aug 14 nicklas 211     var reportTable;
2611 29 Aug 14 nicklas 212     var frm = document.forms['reggie'];    
2611 29 Aug 14 nicklas 213     var reportType = frm.reporttype.value;
2611 29 Aug 14 nicklas 214     var sampleType = frm.sampletype.value;
2611 29 Aug 14 nicklas 215     var tableAlternatives = frm.tablealternatives.value;
2611 29 Aug 14 nicklas 216   
2611 29 Aug 14 nicklas 217     if (reportData != null)
2611 29 Aug 14 nicklas 218     {
2611 29 Aug 14 nicklas 219       if ('samplecount' == reportType)
2611 29 Aug 14 nicklas 220       {
2611 29 Aug 14 nicklas 221         reportTable = createItemCountReport(reportData, reportType);
2611 29 Aug 14 nicklas 222       }
2611 29 Aug 14 nicklas 223       else if ('consentcount' == reportType)
2611 29 Aug 14 nicklas 224       {
2611 29 Aug 14 nicklas 225         reportTable = createConsentCountReport(reportData);
2611 29 Aug 14 nicklas 226       }
2611 29 Aug 14 nicklas 227       else if ('patientcount' == reportType)
2611 29 Aug 14 nicklas 228       {
2611 29 Aug 14 nicklas 229         reportTable = createItemCountReport(reportData, reportType);
2611 29 Aug 14 nicklas 230       }
2611 29 Aug 14 nicklas 231       else if ('overviewreport' == reportType)
2611 29 Aug 14 nicklas 232       {
2611 29 Aug 14 nicklas 233         reportTable = createOverviewReport(reportData);
2611 29 Aug 14 nicklas 234       }
2611 29 Aug 14 nicklas 235       else if ('missingsampledatareport' == reportType)
2611 29 Aug 14 nicklas 236       {
2611 29 Aug 14 nicklas 237         reportTable = createMissingSampleDataReport(reportData);
2611 29 Aug 14 nicklas 238       }
2611 29 Aug 14 nicklas 239     }
2611 29 Aug 14 nicklas 240     else
2611 29 Aug 14 nicklas 241     {
2611 29 Aug 14 nicklas 242       Wizard.setFatalError('No values could be found during given period');
2611 29 Aug 14 nicklas 243       return;
2611 29 Aug 14 nicklas 244     }
2611 29 Aug 14 nicklas 245
2611 29 Aug 14 nicklas 246     var reportDiv = Doc.element('reportdiv');
2611 29 Aug 14 nicklas 247     reportDiv.appendChild(reportTable);
2611 29 Aug 14 nicklas 248     
2611 29 Aug 14 nicklas 249     // Optional extra tables
2611 29 Aug 14 nicklas 250     if ('samplecount' == reportType)
2611 29 Aug 14 nicklas 251     {
2611 29 Aug 14 nicklas 252       if ('blood' == sampleType && tableAlternatives == 'full_blood_sample_tables' && reportData != null)
2611 29 Aug 14 nicklas 253       {
2611 29 Aug 14 nicklas 254         var spacer0 = document.createElement('text');
2611 29 Aug 14 nicklas 255         spacer0.innerHTML = "<BR>";
2611 29 Aug 14 nicklas 256         reportDiv.appendChild(spacer0);
2611 29 Aug 14 nicklas 257         var spacer = document.createElement('text');
2611 29 Aug 14 nicklas 258         spacer.innerHTML = "<BR>";
2611 29 Aug 14 nicklas 259         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 260         // Follow-up
2611 29 Aug 14 nicklas 261         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 262         var reportFollowUp = reportData.reportFollowUp;
2611 29 Aug 14 nicklas 263         var reportFollowUpTable = createItemCountReport(reportFollowUp, reportType);
2611 29 Aug 14 nicklas 264         reportDiv.appendChild(reportFollowUpTable);
2611 29 Aug 14 nicklas 265         // Not follow-up
2611 29 Aug 14 nicklas 266         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 267         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 268         var reportNotFollowUp = reportData.reportNotFollowUp;
2611 29 Aug 14 nicklas 269         var reportNotFollowUpTable = createItemCountReport(reportNotFollowUp, reportType);
2611 29 Aug 14 nicklas 270         reportDiv.appendChild(reportNotFollowUpTable);
2611 29 Aug 14 nicklas 271         // Unknown
2611 29 Aug 14 nicklas 272         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 273         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 274         var reportUnknown = reportData.reportUnknown;
2611 29 Aug 14 nicklas 275         var reportUnknownTable = createItemCountReport(reportUnknown, reportType);
2611 29 Aug 14 nicklas 276         reportDiv.appendChild(reportUnknownTable);
2611 29 Aug 14 nicklas 277         // PreNeo
2611 29 Aug 14 nicklas 278         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 279         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 280         var reportPreNeo = reportData.reportPreNeo;
2611 29 Aug 14 nicklas 281         var reportPreNeoTable = createItemCountReport(reportPreNeo, reportType);
2611 29 Aug 14 nicklas 282         reportDiv.appendChild(reportPreNeoTable);
2611 29 Aug 14 nicklas 283         // PreOp
2611 29 Aug 14 nicklas 284         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 285         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 286         var reportPreOp = reportData.reportPreOp;
2611 29 Aug 14 nicklas 287         var reportPreOpTable = createItemCountReport(reportPreOp, reportType);
2611 29 Aug 14 nicklas 288         reportDiv.appendChild(reportPreOpTable);
2611 29 Aug 14 nicklas 289         // FollowUp06
2611 29 Aug 14 nicklas 290         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 291         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 292         var reportFollowUp06 = reportData.reportFollowUp06;
2611 29 Aug 14 nicklas 293         var reportFollowUp06Table = createItemCountReport(reportFollowUp06, reportType);
2611 29 Aug 14 nicklas 294         reportDiv.appendChild(reportFollowUp06Table);
2611 29 Aug 14 nicklas 295         // FollowUp12
2611 29 Aug 14 nicklas 296         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 297         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 298         var reportFollowUp12 = reportData.reportFollowUp12;
2611 29 Aug 14 nicklas 299         var reportFollowUp12Table = createItemCountReport(reportFollowUp12, reportType);
2611 29 Aug 14 nicklas 300         reportDiv.appendChild(reportFollowUp12Table);
2611 29 Aug 14 nicklas 301         // FollowUp36
2611 29 Aug 14 nicklas 302         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 303         reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 304         var reportFollowUp36 = reportData.reportFollowUp36;
2611 29 Aug 14 nicklas 305         var reportFollowUp36Table = createItemCountReport(reportFollowUp36, reportType);
2611 29 Aug 14 nicklas 306         reportDiv.appendChild(reportFollowUp36Table);
2611 29 Aug 14 nicklas 307         //
2611 29 Aug 14 nicklas 308         // Reset # of blood samples with unknown site or creation date to that for unfiltered report
2611 29 Aug 14 nicklas 309         unknownCreation = reportData.statistics.noDate;
2611 29 Aug 14 nicklas 310         unknownSite = reportData.statistics.unknownSite;
2611 29 Aug 14 nicklas 311       }
2611 29 Aug 14 nicklas 312     }
2611 29 Aug 14 nicklas 313     else if ('consentcount' == reportType)
2611 29 Aug 14 nicklas 314     {
2611 29 Aug 14 nicklas 315       var spacer0 = document.createElement('text');
2611 29 Aug 14 nicklas 316       spacer0.innerHTML = "<BR>";
2611 29 Aug 14 nicklas 317       reportDiv.appendChild(spacer0);
2611 29 Aug 14 nicklas 318       var spacer = document.createElement('text');
2611 29 Aug 14 nicklas 319       spacer.innerHTML = "<BR>";
2611 29 Aug 14 nicklas 320       reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 321       // Table with consents in different categories with date, as well as consents with unknown date
2611 29 Aug 14 nicklas 322       reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 323       var hasDateTable = createConsentCountHasDateTable(reportData);
2611 29 Aug 14 nicklas 324       reportDiv.appendChild(hasDateTable);
2611 29 Aug 14 nicklas 325       // Table with consents in different categories with unknown date, as well as missing consents
2611 29 Aug 14 nicklas 326       reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 327       var unknownDateTable = createConsentCountUnknownDateTable(reportData);
2611 29 Aug 14 nicklas 328       reportDiv.appendChild(unknownDateTable);
2611 29 Aug 14 nicklas 329     }
2611 29 Aug 14 nicklas 330     else if ('overviewreport' == reportType)
2611 29 Aug 14 nicklas 331     {
2611 29 Aug 14 nicklas 332       var spacer0 = document.createElement('text');
2611 29 Aug 14 nicklas 333       spacer0.innerHTML = "<BR>";
2611 29 Aug 14 nicklas 334       reportDiv.appendChild(spacer0);
2611 29 Aug 14 nicklas 335       var spacer = document.createElement('text');
2611 29 Aug 14 nicklas 336       spacer.innerHTML = "<BR>";
2611 29 Aug 14 nicklas 337       reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 338       // Table with patients having at least one item of different sample types
2611 29 Aug 14 nicklas 339       reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 340       var patientWithSampleTable = createOverviewPatientWithSampleTable(reportData);
2611 29 Aug 14 nicklas 341       reportDiv.appendChild(patientWithSampleTable);
2611 29 Aug 14 nicklas 342       // Table with patients having different combinations of sample types
2611 29 Aug 14 nicklas 343       reportDiv.appendChild(spacer);
2611 29 Aug 14 nicklas 344       var patientDetailedTable = createOverviewPatientDetailedTable(reportData);
2611 29 Aug 14 nicklas 345       reportDiv.appendChild(patientDetailedTable);
2611 29 Aug 14 nicklas 346     }
2611 29 Aug 14 nicklas 347     // Summary list
2611 29 Aug 14 nicklas 348     var summaryList = document.createElement('ul');
2611 29 Aug 14 nicklas 349     if (unknownSite == null) unknownSite = 0;
2611 29 Aug 14 nicklas 350     if (unknownCreation == null) unknownCreation = 0;
2611 29 Aug 14 nicklas 351     if ('samplecount' == reportType)
2611 29 Aug 14 nicklas 352     {
2611 29 Aug 14 nicklas 353       var samples = 'specimens';
2611 29 Aug 14 nicklas 354       if ('nospecimen' == sampleType)
2611 29 Aug 14 nicklas 355       {
2611 29 Aug 14 nicklas 356         samples = '"no specimens"';
2611 29 Aug 14 nicklas 357       }
2611 29 Aug 14 nicklas 358       else if ('blood' == sampleType)
2611 29 Aug 14 nicklas 359       {
2611 29 Aug 14 nicklas 360         samples = 'blood samples';
2611 29 Aug 14 nicklas 361       }
2611 29 Aug 14 nicklas 362       summaryList.appendChild(getListElement(unknownSite + ' ' + samples + ' registered to unknown sites.'));
2611 29 Aug 14 nicklas 363       summaryList.appendChild(getListElement(unknownCreation + ' ' + samples + ' without creation date. These are included in the \'Total\' column.'));
2611 29 Aug 14 nicklas 364     }
2611 29 Aug 14 nicklas 365     else if ('consentcount' == reportType)
2611 29 Aug 14 nicklas 366     {
2611 29 Aug 14 nicklas 367       var numDuplicates = 0;
2611 29 Aug 14 nicklas 368       if (report != null)
2611 29 Aug 14 nicklas 369       {
2611 29 Aug 14 nicklas 370         var statistics = reportData.statistics;
2611 29 Aug 14 nicklas 371         numDuplicates = statistics.duplicateKey;
2611 29 Aug 14 nicklas 372       }
2611 29 Aug 14 nicklas 373       if (numDuplicates == null)
2611 29 Aug 14 nicklas 374       {
2611 29 Aug 14 nicklas 375         numDuplicates = 0;
2611 29 Aug 14 nicklas 376       }
2611 29 Aug 14 nicklas 377       summaryList.appendChild(getListElement(unknownSite + ' consents registered to unknown sites.'));
2611 29 Aug 14 nicklas 378       summaryList.appendChild(getListElement(unknownCreation + ' consents without known date. These are included in the \'Total\' column.'));
2611 29 Aug 14 nicklas 379       summaryList.appendChild(getListElement(numMissing + ' missing consents for cases and blood samples. These are NOT included in the \'Total\' column.'));
2611 29 Aug 14 nicklas 380       summaryList.appendChild(getListElement(numDuplicates + ' duplicates ignored.'));
2611 29 Aug 14 nicklas 381
2611 29 Aug 14 nicklas 382       var patientsWithMultipleDates = statistics.patientsWithMultipleDatesKey;
2611 29 Aug 14 nicklas 383       var counter = 0;
2611 29 Aug 14 nicklas 384       for (var key in patientsWithMultipleDates)
2611 29 Aug 14 nicklas 385       {
2611 29 Aug 14 nicklas 386         counter++;
2611 29 Aug 14 nicklas 387       }
2611 29 Aug 14 nicklas 388       var patientsWithMultipleDatesText = counter + ' patients with multiple dates.';
2611 29 Aug 14 nicklas 389       summaryList.appendChild(getListElement(patientsWithMultipleDatesText));
2611 29 Aug 14 nicklas 390     }
2611 29 Aug 14 nicklas 391     else if ('patientcount' == reportType)
2611 29 Aug 14 nicklas 392     {
2611 29 Aug 14 nicklas 393       summaryList.appendChild(getListElement(unknownSite + ' patients registered to unknown sites.'));
2611 29 Aug 14 nicklas 394       summaryList.appendChild(getListElement(unknownCreation + ' patients without creation date. These are included in the \'Total\' column.'));
2611 29 Aug 14 nicklas 395     }
2611 29 Aug 14 nicklas 396     else if ('overviewreport' == reportType)
2611 29 Aug 14 nicklas 397     {
2611 29 Aug 14 nicklas 398       var numBloodNoDate = 0;
2611 29 Aug 14 nicklas 399       var numBloodFUNoDate = 0;
2611 29 Aug 14 nicklas 400       var numSpecimenNoDate = 0;
2611 29 Aug 14 nicklas 401       var numNoSpecimenNoDate = 0;
2611 29 Aug 14 nicklas 402       if (report != null)
2611 29 Aug 14 nicklas 403       {
2611 29 Aug 14 nicklas 404         var statistics = reportData.statistics;
2611 29 Aug 14 nicklas 405         numBloodNoDate = statistics.bloodSampleNoDate;
2611 29 Aug 14 nicklas 406         numBloodFUNoDate = statistics.bloodSampleFollowUpNoDate;
2611 29 Aug 14 nicklas 407         numSpecimenNoDate = statistics.specimenNoDate;
2611 29 Aug 14 nicklas 408         numNoSpecimenNoDate = statistics.noSpecimenNoDate;
2611 29 Aug 14 nicklas 409       }
2611 29 Aug 14 nicklas 410       if (numBloodNoDate == null)
2611 29 Aug 14 nicklas 411       {
2611 29 Aug 14 nicklas 412         numBloodNoDate = 0;
2611 29 Aug 14 nicklas 413       }
2611 29 Aug 14 nicklas 414       if (numBloodFUNoDate == null)
2611 29 Aug 14 nicklas 415       {
2611 29 Aug 14 nicklas 416         numBloodFUNoDate = 0;
2611 29 Aug 14 nicklas 417       }
2611 29 Aug 14 nicklas 418       if (numSpecimenNoDate == null)
2611 29 Aug 14 nicklas 419       {
2611 29 Aug 14 nicklas 420         numSpecimenNoDate = 0;
2611 29 Aug 14 nicklas 421       }
2611 29 Aug 14 nicklas 422       if (numNoSpecimenNoDate == null)
2611 29 Aug 14 nicklas 423       {
2611 29 Aug 14 nicklas 424         numNoSpecimenNoDate = 0;
2611 29 Aug 14 nicklas 425       }
2611 29 Aug 14 nicklas 426       summaryList.appendChild(getListElement(unknownSite + ' patients registered to unknown sites.'));
2611 29 Aug 14 nicklas 427       summaryList.appendChild(getListElement(numPatientsNoSamples + ' patients with no samples.'));
2611 29 Aug 14 nicklas 428       summaryList.appendChild(getListElement('Note: Consents of type "Yes" include consents without patient id (PAT#) or date.'));
2611 29 Aug 14 nicklas 429       summaryList.appendChild(getListElement('Note: Data in column "Blood samples follow-up" are not affected by blood sample filter.'));
2611 29 Aug 14 nicklas 430       summaryList.appendChild(getListElement('Note: Time period filter only affects sample items, patients and consents are derived from these.'));
2611 29 Aug 14 nicklas 431       summaryList.appendChild(getListElement('Note: If creation date is unknown, registration date is used instead.'));
2611 29 Aug 14 nicklas 432       summaryList.appendChild(getListElement('Items with unknown creation date: Blood ' + numBloodNoDate + ', Blood follow-up ' + numBloodFUNoDate + ', Specimen ' + numSpecimenNoDate + ', No specimen ' + numNoSpecimenNoDate));
2611 29 Aug 14 nicklas 433     }
2611 29 Aug 14 nicklas 434     else if ('missingsampledatareport' == reportType)
2611 29 Aug 14 nicklas 435     {
2611 29 Aug 14 nicklas 436       summaryList.appendChild(getListElement('Note: Patient name is considered missing if either "all first names" or "family name" is missing.'));
2611 29 Aug 14 nicklas 437       if (permissionDeniedForPatientName)
2611 29 Aug 14 nicklas 438       {
2611 29 Aug 14 nicklas 439         var patientNamePermissionWarning = document.createElement('li');
2611 29 Aug 14 nicklas 440         patientNamePermissionWarning.innerHTML = 'Sorry, logged-in user does not have permission to check patient names.';
2611 29 Aug 14 nicklas 441         summaryList.appendChild(patientNamePermissionWarning);
2611 29 Aug 14 nicklas 442       }
2611 29 Aug 14 nicklas 443       if (permissionDeniedForPad)
2611 29 Aug 14 nicklas 444       {
2611 29 Aug 14 nicklas 445         var padPermissionWarning = document.createElement('li');
2611 29 Aug 14 nicklas 446         padPermissionWarning.innerHTML = 'Sorry, logged-in user does not have permission to check PAD values.';
2611 29 Aug 14 nicklas 447         summaryList.appendChild(padPermissionWarning);
2611 29 Aug 14 nicklas 448       }
2611 29 Aug 14 nicklas 449     }
2611 29 Aug 14 nicklas 450     reportDiv.appendChild(summaryList);
2611 29 Aug 14 nicklas 451     if ('consentcount' == reportType)
2611 29 Aug 14 nicklas 452     {
2611 29 Aug 14 nicklas 453       // Add table with patients with consents with multiple dates
2611 29 Aug 14 nicklas 454       var multipleDatesTable = createConsentTablePatientsWithMultipleDates(reportData);
2611 29 Aug 14 nicklas 455       reportDiv.appendChild(multipleDatesTable);
2611 29 Aug 14 nicklas 456     }
2611 29 Aug 14 nicklas 457     
2611 29 Aug 14 nicklas 458     Doc.show('step-3');
2611 29 Aug 14 nicklas 459     Doc.show('gorestart');
2611 29 Aug 14 nicklas 460   }
2611 29 Aug 14 nicklas 461
2611 29 Aug 14 nicklas 462   
2611 29 Aug 14 nicklas 463   report.printVersion = function()
2611 29 Aug 14 nicklas 464   {
2611 29 Aug 14 nicklas 465     var frm = document.forms['reggie'];
2611 29 Aug 14 nicklas 466     var reportName = frm.reporttype[frm.reporttype.selectedIndex].text;
2611 29 Aug 14 nicklas 467     var printNote = '<b>Note!</b> For better printing set page orientation to <i>landscape</i>.';
2611 29 Aug 14 nicklas 468     Reggie.openPrintWindow('step-3-content', reportName, 'landscape', printNote, '../', 'report.css');
2611 29 Aug 14 nicklas 469   }
2611 29 Aug 14 nicklas 470
2611 29 Aug 14 nicklas 471   return report;
2611 29 Aug 14 nicklas 472 }();
2611 29 Aug 14 nicklas 473
2611 29 Aug 14 nicklas 474 Doc.onLoad(Report.initPage);
2611 29 Aug 14 nicklas 475
2611 29 Aug 14 nicklas 476
2611 29 Aug 14 nicklas 477 var numCols;
2611 29 Aug 14 nicklas 478 var unknownSite = 0;
2611 29 Aug 14 nicklas 479 var unknownCreation = 0;
2611 29 Aug 14 nicklas 480 var numMissing = 0;
2611 29 Aug 14 nicklas 481 var numPatientsNoSamples = 0;
2611 29 Aug 14 nicklas 482
2611 29 Aug 14 nicklas 483 var month=new Array(12);
2611 29 Aug 14 nicklas 484   month[0]="Jan";
2611 29 Aug 14 nicklas 485   month[1]="Feb";
2611 29 Aug 14 nicklas 486   month[2]="Mar";
2611 29 Aug 14 nicklas 487   month[3]="Apr";
2611 29 Aug 14 nicklas 488   month[4]="May";
2611 29 Aug 14 nicklas 489   month[5]="Jun";
2611 29 Aug 14 nicklas 490   month[6]="Jul";
2611 29 Aug 14 nicklas 491   month[7]="Aug";
2611 29 Aug 14 nicklas 492   month[8]="Sep";
2611 29 Aug 14 nicklas 493   month[9]="Oct";
2611 29 Aug 14 nicklas 494   month[10]="Nov";
2611 29 Aug 14 nicklas 495   month[11]="Dec";
2611 29 Aug 14 nicklas 496
2611 29 Aug 14 nicklas 497
2611 29 Aug 14 nicklas 498
2611 29 Aug 14 nicklas 499 function createMissingConsentDataSampleListPreview(allLines, previewTitle, previewList)
2611 29 Aug 14 nicklas 500 {
2611 29 Aug 14 nicklas 501   var numCases = allLines.length - 2; // First line is a header line
2611 29 Aug 14 nicklas 502     
2611 29 Aug 14 nicklas 503   var html = '<tr><th>'+allLines[0].replace(/\t/g, '</th><th>')+'</th></tr>';
2611 29 Aug 14 nicklas 504   // Check last column for the 'Consent' value
2611 29 Aug 14 nicklas 505   var numConsentWithoutDate = 0;
2611 29 Aug 14 nicklas 506   var numMissingConsent = 0;
2611 29 Aug 14 nicklas 507   var numYesConsent = 0;
2611 29 Aug 14 nicklas 508   var numNoConsent = 0;
2611 29 Aug 14 nicklas 509   var numNotAskedConsent = 0;
2611 29 Aug 14 nicklas 510   for (var i = 1 ; i <= numCases; i++)
2611 29 Aug 14 nicklas 511   {
2611 29 Aug 14 nicklas 512     var line = allLines[i];
2611 29 Aug 14 nicklas 513     var cols = line.split(/\t/);
2611 29 Aug 14 nicklas 514     var consent = cols[cols.length-1];
2611 29 Aug 14 nicklas 515     var rowClass = '';
2611 29 Aug 14 nicklas 516     if (consent == null || consent == 'null')
2611 29 Aug 14 nicklas 517     {
2611 29 Aug 14 nicklas 518       rowClass = 'consent-warning';
2611 29 Aug 14 nicklas 519       numMissingConsent++;
2611 29 Aug 14 nicklas 520     }
2611 29 Aug 14 nicklas 521     else if (consent == 'Yes')
2611 29 Aug 14 nicklas 522     {
2611 29 Aug 14 nicklas 523       numYesConsent++;
2611 29 Aug 14 nicklas 524     }
2611 29 Aug 14 nicklas 525     else if (consent == 'No')
2611 29 Aug 14 nicklas 526     {
2611 29 Aug 14 nicklas 527       numNoConsent++;
2611 29 Aug 14 nicklas 528     }
2611 29 Aug 14 nicklas 529     else if (consent == 'Not asked')
2611 29 Aug 14 nicklas 530     {
2611 29 Aug 14 nicklas 531       numNotAskedConsent++;
2611 29 Aug 14 nicklas 532     }
2611 29 Aug 14 nicklas 533     html += '<tr class="'+rowClass+'"><td>'+cols.join('</td><td>')+'</td></tr>';
2611 29 Aug 14 nicklas 534   }
2611 29 Aug 14 nicklas 535   numConsentWithoutDate = numCases - numMissingConsent;
2611 29 Aug 14 nicklas 536
2611 29 Aug 14 nicklas 537   previewTitle.innerHTML = numCases + ' Samples = ' + numConsentWithoutDate + ' unknown date (' + numYesConsent + ' Yes, ' + numNoConsent + ' No, ' + numNotAskedConsent + ' Not asked) + ' + numMissingConsent + ' missing consent';
2611 29 Aug 14 nicklas 538   previewList.innerHTML = '<table>'+html+'</table>';
2842 20 Oct 14 nicklas 539   Doc.show('previewWrapper');
2611 29 Aug 14 nicklas 540 }
2611 29 Aug 14 nicklas 541
2611 29 Aug 14 nicklas 542 function createMissingDataSampleListPreview(allLines, sampleTypes, previewTitle, previewList)
2611 29 Aug 14 nicklas 543 {
2611 29 Aug 14 nicklas 544   var numCases = allLines.length - 2; // First line is a header line
2611 29 Aug 14 nicklas 545   var numSpecimen = 0;
2611 29 Aug 14 nicklas 546   var numNoSpecimen = 0;
2611 29 Aug 14 nicklas 547     
2611 29 Aug 14 nicklas 548   var html = '<tr><th>'+allLines[0].replace(/\t/g, '</th><th>')+'</th></tr>';
2611 29 Aug 14 nicklas 549   // Check second column for the 'Subtype' value
2611 29 Aug 14 nicklas 550   var numNoConsent = 0;
2611 29 Aug 14 nicklas 551   var numMissingConsent = 0;
2611 29 Aug 14 nicklas 552   for (var i = 1 ; i <= numCases; i++)
2611 29 Aug 14 nicklas 553   {
2611 29 Aug 14 nicklas 554     var line = allLines[i];
2611 29 Aug 14 nicklas 555     var cols = line.split(/\t/);
2611 29 Aug 14 nicklas 556     var sampleSubtype = cols[1];
2611 29 Aug 14 nicklas 557     if (sampleSubtype == 'Specimen')
2611 29 Aug 14 nicklas 558     {
2611 29 Aug 14 nicklas 559       numSpecimen++;
2611 29 Aug 14 nicklas 560     }
2611 29 Aug 14 nicklas 561     else if (sampleSubtype == 'NoSpecimen')
2611 29 Aug 14 nicklas 562     {
2611 29 Aug 14 nicklas 563       numNoSpecimen++;
2611 29 Aug 14 nicklas 564     }
2611 29 Aug 14 nicklas 565     var rowClass = '';
2611 29 Aug 14 nicklas 566     html += '<tr class="'+rowClass+'"><td>'+cols.join('</td><td>')+'</td></tr>';
2611 29 Aug 14 nicklas 567   }
2611 29 Aug 14 nicklas 568
2611 29 Aug 14 nicklas 569   previewTitle.innerHTML = 'Sample type(s) - ' + sampleTypes + ' (' + numCases + ')';
2611 29 Aug 14 nicklas 570   if (sampleTypes == 'Specimen' || sampleTypes == 'No specimen')
2611 29 Aug 14 nicklas 571   {
2611 29 Aug 14 nicklas 572     // Report the number of each subtype for 'Specimen/No specimen'
2611 29 Aug 14 nicklas 573     previewTitle.innerHTML = 'Sample type(s) - Specimen (' + numSpecimen + ')/No specimen (' + numNoSpecimen + ') Total (' + numCases + ')';
2611 29 Aug 14 nicklas 574   }
2611 29 Aug 14 nicklas 575   previewList.innerHTML = '<table>'+html+'</table>';
2842 20 Oct 14 nicklas 576   Doc.show('previewWrapper');
2611 29 Aug 14 nicklas 577 }
2611 29 Aug 14 nicklas 578
2611 29 Aug 14 nicklas 579 function createItemCountReport(report, reportType)
2611 29 Aug 14 nicklas 580 {
2611 29 Aug 14 nicklas 581   var reportTable = getReportTable();
2611 29 Aug 14 nicklas 582   var sdString = report.beginDate;
2611 29 Aug 14 nicklas 583   var edString = report.endDate;
2611 29 Aug 14 nicklas 584   var psdString = report.periodBeginDate;
2611 29 Aug 14 nicklas 585   var ldString = report.latestDate;
2611 29 Aug 14 nicklas 586   var startDate = dateStrToDate(sdString);
2611 29 Aug 14 nicklas 587   var endDate = dateStrToDate(edString);
2611 29 Aug 14 nicklas 588   var periodStartDate = dateStrToDate(psdString);
2611 29 Aug 14 nicklas 589   var latestDate = dateStrToDate(ldString);
2611 29 Aug 14 nicklas 590   
2611 29 Aug 14 nicklas 591   var viewType = report.viewType;    
2611 29 Aug 14 nicklas 592   var sampleType = report.sampleType;
2611 29 Aug 14 nicklas 593   var tableAlternatives = report.tableAlternatives;
2611 29 Aug 14 nicklas 594   var bloodSampleFilter = report.bloodSampleFilter;
2611 29 Aug 14 nicklas 595
2611 29 Aug 14 nicklas 596   var headerRow = document.createElement('tr');    
2611 29 Aug 14 nicklas 597   var subHeaderRowYear = document.createElement('tr');
2611 29 Aug 14 nicklas 598   var columnHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 599   
2611 29 Aug 14 nicklas 600   var headerText = '# Items by ';
2611 29 Aug 14 nicklas 601   var startDateStr = addHyphensToDateString(sdString);
2611 29 Aug 14 nicklas 602   var endDateStr = addHyphensToDateString(edString);
2611 29 Aug 14 nicklas 603   var latestDateStr = addHyphensToDateString(ldString);
2611 29 Aug 14 nicklas 604   if ('samplecount' == reportType)
2611 29 Aug 14 nicklas 605   {
2611 29 Aug 14 nicklas 606     headerText = '# Specimens by ';
2611 29 Aug 14 nicklas 607     if ('nospecimen' == sampleType)
2611 29 Aug 14 nicklas 608     {
2611 29 Aug 14 nicklas 609       headerText = '# "No specimens" by ';
2611 29 Aug 14 nicklas 610     }
2611 29 Aug 14 nicklas 611     else if ('blood' == sampleType)
2611 29 Aug 14 nicklas 612     {
2611 29 Aug 14 nicklas 613       headerText = '# Blood samples by ';
2611 29 Aug 14 nicklas 614       if (bloodSampleFilter != null && bloodSampleFilter != 'none')
2611 29 Aug 14 nicklas 615       {
2611 29 Aug 14 nicklas 616         bloodSampleFilterDisplayText = getBloodSampleFilterDisplayText(bloodSampleFilter);
2611 29 Aug 14 nicklas 617         headerText = '# Blood samples of type \'' + bloodSampleFilterDisplayText + '\' by ';
2611 29 Aug 14 nicklas 618       }
2611 29 Aug 14 nicklas 619     }
2611 29 Aug 14 nicklas 620   }
2611 29 Aug 14 nicklas 621   else if ('patientcount' == reportType)
2611 29 Aug 14 nicklas 622   {
2611 29 Aug 14 nicklas 623     headerText = '# Patients by ';
2611 29 Aug 14 nicklas 624   }
2611 29 Aug 14 nicklas 625   if (viewType == 'WEEK')
2611 29 Aug 14 nicklas 626   {  
2611 29 Aug 14 nicklas 627     var startWeek = getISOWeekNumber(periodStartDate);
2611 29 Aug 14 nicklas 628     var endWeek = getISOWeekNumber(endDate);
2611 29 Aug 14 nicklas 629     var tempDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate()-periodStartDate.getDay()+1);
2611 29 Aug 14 nicklas 630     numCols = 0;
2611 29 Aug 14 nicklas 631     while (tempDate < endDate)
2611 29 Aug 14 nicklas 632     {
2611 29 Aug 14 nicklas 633       numCols++;
2611 29 Aug 14 nicklas 634       tempDate.setDate(tempDate.getDate()+7);
2611 29 Aug 14 nicklas 635     }
2611 29 Aug 14 nicklas 636     headerText += 'week';
2611 29 Aug 14 nicklas 637   }
2611 29 Aug 14 nicklas 638   else if (viewType == 'MONTH')
2611 29 Aug 14 nicklas 639   {
2611 29 Aug 14 nicklas 640     numCols = (endDate.getFullYear()-periodStartDate.getFullYear())*12 + endDate.getMonth()-periodStartDate.getMonth()+1;
2611 29 Aug 14 nicklas 641     headerText += 'month';
2611 29 Aug 14 nicklas 642   }
2611 29 Aug 14 nicklas 643   else if (viewType == 'QUARTER')
2611 29 Aug 14 nicklas 644   {
2611 29 Aug 14 nicklas 645     // First year (from start quarter to end of year)
2611 29 Aug 14 nicklas 646     numCols = 4 - Math.floor(periodStartDate.getMonth()/3);
2611 29 Aug 14 nicklas 647     // Last year (from start of year to end quarter) 
2611 29 Aug 14 nicklas 648     numCols += Math.floor(endDate.getMonth()/3)+1;
2611 29 Aug 14 nicklas 649     // If first and last year is the same, subtract 4 quarters
2611 29 Aug 14 nicklas 650     if (endDate.getFullYear() - periodStartDate.getFullYear() == 0)
2611 29 Aug 14 nicklas 651     {
2611 29 Aug 14 nicklas 652       numCols -= 4;
2611 29 Aug 14 nicklas 653     }
2611 29 Aug 14 nicklas 654     // Full years between start and end dates
2611 29 Aug 14 nicklas 655     if((endDate.getFullYear() - periodStartDate.getFullYear()) > 1)
2611 29 Aug 14 nicklas 656     {
2611 29 Aug 14 nicklas 657       numCols += 4 * (endDate.getFullYear() - periodStartDate.getFullYear()-1);
2611 29 Aug 14 nicklas 658     }
2611 29 Aug 14 nicklas 659     headerText += 'quarter';
2611 29 Aug 14 nicklas 660   }
2611 29 Aug 14 nicklas 661   else
2611 29 Aug 14 nicklas 662   {
2611 29 Aug 14 nicklas 663     numCols = endDate.getFullYear() - periodStartDate.getFullYear() + 1;
2611 29 Aug 14 nicklas 664     headerText += 'year';
2611 29 Aug 14 nicklas 665   }
2611 29 Aug 14 nicklas 666     
2611 29 Aug 14 nicklas 667   // Set table header
2611 29 Aug 14 nicklas 668   headerText += ' (between ' + startDateStr + ' and ' + endDateStr + ')';
2611 29 Aug 14 nicklas 669   if (latestDate != null)
2611 29 Aug 14 nicklas 670   {
2611 29 Aug 14 nicklas 671     headerText += '\nLast registration ' + latestDateStr;
2611 29 Aug 14 nicklas 672   }    
2611 29 Aug 14 nicklas 673   headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+5)));
2611 29 Aug 14 nicklas 674   
2611 29 Aug 14 nicklas 675   // Sub headers
2611 29 Aug 14 nicklas 676   // Only if each datacol is less then a year
2611 29 Aug 14 nicklas 677   if (viewType != 'YEAR')
2611 29 Aug 14 nicklas 678   {
2611 29 Aug 14 nicklas 679     subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader', 3));
2611 29 Aug 14 nicklas 680     addYearSubHeaders(periodStartDate, endDate, subHeaderRowYear, viewType);      
2611 29 Aug 14 nicklas 681     subHeaderRowYear.appendChild(getTableCellElement('', 'reportsubheader', 2));
2611 29 Aug 14 nicklas 682   }    
2611 29 Aug 14 nicklas 683         
2611 29 Aug 14 nicklas 684   // Columnsheader    
2611 29 Aug 14 nicklas 685   var siteHeader = getTableCellElement('Site', 'reportsubheader');      
2611 29 Aug 14 nicklas 686   var startDateHeader = getTableCellElement('Start date','reportsubheader');
2611 29 Aug 14 nicklas 687   var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
2611 29 Aug 14 nicklas 688   columnHeaderRow.appendChild(siteHeader);
2611 29 Aug 14 nicklas 689   columnHeaderRow.appendChild(startDateHeader);  
2611 29 Aug 14 nicklas 690   columnHeaderRow.appendChild(latestDateHeader);  
2611 29 Aug 14 nicklas 691   
2611 29 Aug 14 nicklas 692   if (viewType == 'MONTH') addMonthColumnHeaders(columnHeaderRow, periodStartDate);
2611 29 Aug 14 nicklas 693   else if (viewType == 'WEEK') addWeekColumnHeaders(columnHeaderRow, periodStartDate);
2611 29 Aug 14 nicklas 694   else if (viewType == 'QUARTER') addQuarterColumnHeaders(columnHeaderRow, periodStartDate);
2611 29 Aug 14 nicklas 695   else if (viewType == 'YEAR') addYearSubHeaders(periodStartDate, endDate, columnHeaderRow, viewType);
2611 29 Aug 14 nicklas 696   
2611 29 Aug 14 nicklas 697   
2611 29 Aug 14 nicklas 698   columnHeaderRow.appendChild(getTableCellElement('Sum', 'reportsubheader'));
2611 29 Aug 14 nicklas 699   columnHeaderRow.appendChild(getTableCellElement('Total', 'reportsubheader'));
2611 29 Aug 14 nicklas 700
2611 29 Aug 14 nicklas 701   // Build table      
2611 29 Aug 14 nicklas 702   reportTable.appendChild(headerRow);
2611 29 Aug 14 nicklas 703   reportTable.appendChild(subHeaderRowYear);
2611 29 Aug 14 nicklas 704   reportTable.appendChild(columnHeaderRow);
2611 29 Aug 14 nicklas 705         
2611 29 Aug 14 nicklas 706   // Data rows      
2611 29 Aug 14 nicklas 707   addDataRowsToTable(report, reportTable);
2611 29 Aug 14 nicklas 708     
2611 29 Aug 14 nicklas 709   // Add a row with the combined numbers for all sites for each period
2611 29 Aug 14 nicklas 710   var sitesCombinedRow = document.createElement('tr');
2611 29 Aug 14 nicklas 711   sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
2611 29 Aug 14 nicklas 712   sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary', 2));
2611 29 Aug 14 nicklas 713   // Get combined numbers for all sites for each period
2611 29 Aug 14 nicklas 714   var statistics = report.statistics;
2611 29 Aug 14 nicklas 715   var sitesCombined = statistics.sitesCombinedKey;    
2611 29 Aug 14 nicklas 716   var sortedKeyArray = createSortedPeriodArray(report, numCols);
2611 29 Aug 14 nicklas 717   var key;
2611 29 Aug 14 nicklas 718   for (arrayIndex in sortedKeyArray)
2611 29 Aug 14 nicklas 719   {
2611 29 Aug 14 nicklas 720     key = sortedKeyArray[arrayIndex];
2611 29 Aug 14 nicklas 721     var data = getJSONData(sitesCombined, key, 0);
2611 29 Aug 14 nicklas 722     // Add entry with sample sum for site for selected time period
2611 29 Aug 14 nicklas 723     sitesCombinedRow.appendChild(getTableCellElement(data,'colsummary'));
2611 29 Aug 14 nicklas 724   }
2611 29 Aug 14 nicklas 725   // Get total number of samples for site for the selected time period
2611 29 Aug 14 nicklas 726   var sum = getJSONData(statistics, 'sumKey', 0);
2611 29 Aug 14 nicklas 727   // Add entry with total number of samples for site for the selected time period
2611 29 Aug 14 nicklas 728   sitesCombinedRow.appendChild(getTableCellElement(sum, 'colsummary'));
2611 29 Aug 14 nicklas 729   // Get total number of samples for all sites, regardless of creation date
2611 29 Aug 14 nicklas 730   var total = getJSONData(statistics, 'totalKey', 0);
2611 29 Aug 14 nicklas 731   // Add entry with total number of samples for all sites, regardless of creation date
2611 29 Aug 14 nicklas 732   sitesCombinedRow.appendChild(getTableCellElement(total, 'colsummary'));
2611 29 Aug 14 nicklas 733   reportTable.appendChild(sitesCombinedRow);  
2611 29 Aug 14 nicklas 734
2611 29 Aug 14 nicklas 735   return reportTable;
2611 29 Aug 14 nicklas 736 }
2611 29 Aug 14 nicklas 737
2611 29 Aug 14 nicklas 738 function createConsentCountReport(report)
2611 29 Aug 14 nicklas 739 {
2611 29 Aug 14 nicklas 740   var reportTable = getReportTable();
2611 29 Aug 14 nicklas 741   var sdString = report.beginDate;
2611 29 Aug 14 nicklas 742   var edString = report.endDate;
2611 29 Aug 14 nicklas 743   var ldString = report.latestDate;
2611 29 Aug 14 nicklas 744   var startDate = dateStrToDate(sdString);
2611 29 Aug 14 nicklas 745   var endDate = dateStrToDate(edString);
2611 29 Aug 14 nicklas 746   var latestDate = dateStrToDate(ldString);
2611 29 Aug 14 nicklas 747
2611 29 Aug 14 nicklas 748   var headerRow = document.createElement('tr');    
2611 29 Aug 14 nicklas 749   var subHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 750   var columnHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 751   
2611 29 Aug 14 nicklas 752   var numCols = 5;
2611 29 Aug 14 nicklas 753   var numDecimals = 0;
2611 29 Aug 14 nicklas 754   var headerText = '# Consent forms of different types for cases and blood samples';
2611 29 Aug 14 nicklas 755   var startDateStr = addHyphensToDateString(sdString);
2611 29 Aug 14 nicklas 756   var endDateStr = addHyphensToDateString(edString);
2611 29 Aug 14 nicklas 757   var latestDateStr = addHyphensToDateString(ldString);
2611 29 Aug 14 nicklas 758   headerText += ' (betweeen ' + startDateStr + ' and ' + endDateStr + ')';
2611 29 Aug 14 nicklas 759   if (latestDate != null)
2611 29 Aug 14 nicklas 760   {
2611 29 Aug 14 nicklas 761       headerText += '\nLast registration ' + latestDateStr;
2611 29 Aug 14 nicklas 762   }
4177 25 Oct 16 nicklas 763   headerText += '\nConsents without date are included if the registration date is within the selected time period';
2611 29 Aug 14 nicklas 764   headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+3)));
2611 29 Aug 14 nicklas 765   
2611 29 Aug 14 nicklas 766   // Subheader    
2611 29 Aug 14 nicklas 767   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 3));
2611 29 Aug 14 nicklas 768   
2611 29 Aug 14 nicklas 769   subHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
2611 29 Aug 14 nicklas 770   subHeaderRow.appendChild(getTableCellElement('No', 'reportsubheader'));
2611 29 Aug 14 nicklas 771   subHeaderRow.appendChild(getTableCellElement('Not asked', 'reportsubheader'));
2611 29 Aug 14 nicklas 772   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 2));
2611 29 Aug 14 nicklas 773
2611 29 Aug 14 nicklas 774   // Columnsheader    
2611 29 Aug 14 nicklas 775   var siteHeader = getTableCellElement('Site', 'reportsubheader');      
2611 29 Aug 14 nicklas 776   var startDateHeader = getTableCellElement('Start date','reportsubheader');
2611 29 Aug 14 nicklas 777   var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
2611 29 Aug 14 nicklas 778   columnHeaderRow.appendChild(siteHeader);
2611 29 Aug 14 nicklas 779   columnHeaderRow.appendChild(startDateHeader);  
2611 29 Aug 14 nicklas 780   columnHeaderRow.appendChild(latestDateHeader);  
2611 29 Aug 14 nicklas 781   
2611 29 Aug 14 nicklas 782   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 783   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 784   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 785   columnHeaderRow.appendChild(getTableCellElement('Sum', 'reportsubheader'));
2611 29 Aug 14 nicklas 786   columnHeaderRow.appendChild(getTableCellElement('Total', 'reportsubheader'));
2611 29 Aug 14 nicklas 787
2611 29 Aug 14 nicklas 788   // Build table      
2611 29 Aug 14 nicklas 789   reportTable.appendChild(headerRow);
2611 29 Aug 14 nicklas 790   reportTable.appendChild(subHeaderRow);
2611 29 Aug 14 nicklas 791   reportTable.appendChild(columnHeaderRow);
2611 29 Aug 14 nicklas 792         
2611 29 Aug 14 nicklas 793   // Data rows      
2611 29 Aug 14 nicklas 794   addDataRowsToConsentTable(report, reportTable);
2611 29 Aug 14 nicklas 795     
2611 29 Aug 14 nicklas 796   // Add a row with the combined numbers for all sites for each period
2611 29 Aug 14 nicklas 797   var sitesCombinedRow = document.createElement('tr');
2611 29 Aug 14 nicklas 798   sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
2611 29 Aug 14 nicklas 799   sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary', 2));
2611 29 Aug 14 nicklas 800   // Get combined numbers for all sites for each period
2611 29 Aug 14 nicklas 801   var noDateKey = 'noDate';
2611 29 Aug 14 nicklas 802   var sumDateIgnoredKey = 'sumDateIgnoredKey';
2611 29 Aug 14 nicklas 803   var statistics = report.statistics;
2611 29 Aug 14 nicklas 804   var sitesCombined = statistics.sitesCombinedKey;
2611 29 Aug 14 nicklas 805   if (sitesCombined != null)
2611 29 Aug 14 nicklas 806   {
2611 29 Aug 14 nicklas 807     data = getJSONDataWithPercent(sitesCombined, 'yes', sumDateIgnoredKey, numDecimals);
2611 29 Aug 14 nicklas 808     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 809     data = getJSONDataWithPercent(sitesCombined, 'no', sumDateIgnoredKey, numDecimals);
2611 29 Aug 14 nicklas 810     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 811     data = getJSONDataWithPercent(sitesCombined, 'notAsked', sumDateIgnoredKey, numDecimals);
2611 29 Aug 14 nicklas 812     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 813   }
2611 29 Aug 14 nicklas 814   // Add entry with total number of consents with chosen restrictions
2611 29 Aug 14 nicklas 815   data = getJSONData(sitesCombined, sumDateIgnoredKey, 0);
2611 29 Aug 14 nicklas 816   sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 817   // Add entry with total number of consents, regardless of restrictions
2611 29 Aug 14 nicklas 818   var totalKey = 'totalKey';
2611 29 Aug 14 nicklas 819   data = getJSONData(sitesCombined, totalKey, 0);
2611 29 Aug 14 nicklas 820   sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 821   reportTable.appendChild(sitesCombinedRow);  
2611 29 Aug 14 nicklas 822
2611 29 Aug 14 nicklas 823   return reportTable;
2611 29 Aug 14 nicklas 824 }
2611 29 Aug 14 nicklas 825
2611 29 Aug 14 nicklas 826 function createConsentCountHasDateTable(report)
2611 29 Aug 14 nicklas 827 {
2611 29 Aug 14 nicklas 828   var reportTable = getReportTable();
2611 29 Aug 14 nicklas 829   var sdString = report.beginDate;
2611 29 Aug 14 nicklas 830   var edString = report.endDate;
2611 29 Aug 14 nicklas 831   var ldString = report.latestDate;
2611 29 Aug 14 nicklas 832   var startDate = dateStrToDate(sdString);
2611 29 Aug 14 nicklas 833   var endDate = dateStrToDate(edString);
2611 29 Aug 14 nicklas 834   var latestDate = dateStrToDate(ldString);
2611 29 Aug 14 nicklas 835
2611 29 Aug 14 nicklas 836   var headerRow = document.createElement('tr');    
2611 29 Aug 14 nicklas 837   var subHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 838   var columnHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 839   
2611 29 Aug 14 nicklas 840   var numCols = 5;
2611 29 Aug 14 nicklas 841   var numDecimals = 0;
2611 29 Aug 14 nicklas 842   var headerText = '# Consent forms of different types for cases and blood samples';
2611 29 Aug 14 nicklas 843   var startDateStr = addHyphensToDateString(sdString);
2611 29 Aug 14 nicklas 844   var endDateStr = addHyphensToDateString(edString);
2611 29 Aug 14 nicklas 845   var latestDateStr = addHyphensToDateString(ldString);
2611 29 Aug 14 nicklas 846   headerText += ' (betweeen ' + startDateStr + ' and ' + endDateStr + ')';
2611 29 Aug 14 nicklas 847   if (latestDate != null)
2611 29 Aug 14 nicklas 848   {
2611 29 Aug 14 nicklas 849       headerText += '\nLast registration ' + latestDateStr;
2611 29 Aug 14 nicklas 850   }
2611 29 Aug 14 nicklas 851   headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+5)));
2611 29 Aug 14 nicklas 852   
2611 29 Aug 14 nicklas 853   // Subheader    
2611 29 Aug 14 nicklas 854   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 3));
2611 29 Aug 14 nicklas 855   
2611 29 Aug 14 nicklas 856   subHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
2611 29 Aug 14 nicklas 857   subHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
2611 29 Aug 14 nicklas 858   subHeaderRow.appendChild(getTableCellElement('No', 'reportsubheader'));
2611 29 Aug 14 nicklas 859   subHeaderRow.appendChild(getTableCellElement('Not asked', 'reportsubheader'));
2611 29 Aug 14 nicklas 860   subHeaderRow.appendChild(getTableCellElement('Unknown date', 'reportsubheader'));
2611 29 Aug 14 nicklas 861   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 2));
2611 29 Aug 14 nicklas 862
2611 29 Aug 14 nicklas 863   // Columnsheader    
2611 29 Aug 14 nicklas 864   var siteHeader = getTableCellElement('Site', 'reportsubheader');      
2611 29 Aug 14 nicklas 865   var startDateHeader = getTableCellElement('Start date','reportsubheader');
2611 29 Aug 14 nicklas 866   var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
2611 29 Aug 14 nicklas 867   columnHeaderRow.appendChild(siteHeader);
2611 29 Aug 14 nicklas 868   columnHeaderRow.appendChild(startDateHeader);  
2611 29 Aug 14 nicklas 869   columnHeaderRow.appendChild(latestDateHeader);  
2611 29 Aug 14 nicklas 870   
2611 29 Aug 14 nicklas 871   columnHeaderRow.appendChild(getTableCellElement('(has PAT#)', 'reportsubheader'));
2611 29 Aug 14 nicklas 872   columnHeaderRow.appendChild(getTableCellElement('(no PAT#)', 'reportsubheader'));
2611 29 Aug 14 nicklas 873   columnHeaderRow.appendChild(getTableCellElement('(has date)', 'reportsubheader'));
2611 29 Aug 14 nicklas 874   columnHeaderRow.appendChild(getTableCellElement('(has date)', 'reportsubheader'));
2611 29 Aug 14 nicklas 875   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 876   columnHeaderRow.appendChild(getTableCellElement('Sum', 'reportsubheader'));
2611 29 Aug 14 nicklas 877   columnHeaderRow.appendChild(getTableCellElement('Total', 'reportsubheader'));
2611 29 Aug 14 nicklas 878
2611 29 Aug 14 nicklas 879   // Build table      
2611 29 Aug 14 nicklas 880   reportTable.appendChild(headerRow);
2611 29 Aug 14 nicklas 881   reportTable.appendChild(subHeaderRow);
2611 29 Aug 14 nicklas 882   reportTable.appendChild(columnHeaderRow);
2611 29 Aug 14 nicklas 883         
2611 29 Aug 14 nicklas 884   // Data rows      
2611 29 Aug 14 nicklas 885   addDataRowsToConsentTableHasDate(report, reportTable);
2611 29 Aug 14 nicklas 886     
2611 29 Aug 14 nicklas 887   // Add a row with the combined numbers for all sites for each period
2611 29 Aug 14 nicklas 888   var sitesCombinedRow = document.createElement('tr');
2611 29 Aug 14 nicklas 889   sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
2611 29 Aug 14 nicklas 890   sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary', 2));
2611 29 Aug 14 nicklas 891   // Get combined numbers for all sites for each period
2611 29 Aug 14 nicklas 892   var noDateKey = 'noDate';
2611 29 Aug 14 nicklas 893   var sumKey = 'sumKey';
2611 29 Aug 14 nicklas 894   var statistics = report.statistics;
2611 29 Aug 14 nicklas 895   var sitesCombined = statistics.sitesCombinedKey;
2611 29 Aug 14 nicklas 896   if (sitesCombined != null)
2611 29 Aug 14 nicklas 897   {
2611 29 Aug 14 nicklas 898     data = getJSONDataWithPercent(sitesCombined, 'yesPatientExistsDateExists', sumKey, numDecimals);
2611 29 Aug 14 nicklas 899     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 900     data = getJSONDataWithPercent(sitesCombined, 'yesPatientUnknownDateExists', sumKey, numDecimals);
2611 29 Aug 14 nicklas 901     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 902     data = getJSONDataWithPercent(sitesCombined, 'noDateExists', sumKey, numDecimals);
2611 29 Aug 14 nicklas 903     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 904     data = getJSONDataWithPercent(sitesCombined, 'notAskedDateExists', sumKey, numDecimals);
2611 29 Aug 14 nicklas 905     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 906     data = getJSONDataWithPercent(sitesCombined, noDateKey, sumKey, numDecimals);
2611 29 Aug 14 nicklas 907     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 908   }
2611 29 Aug 14 nicklas 909   // Add entry with total number of consents with chosen restrictions
2611 29 Aug 14 nicklas 910   data = getJSONData(sitesCombined, sumKey, 0);
2611 29 Aug 14 nicklas 911   sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 912   // Add entry with total number of consents, regardless of restrictions
2611 29 Aug 14 nicklas 913   var totalKey = 'totalKey';
2611 29 Aug 14 nicklas 914   data = getJSONData(sitesCombined, totalKey, 0);
2611 29 Aug 14 nicklas 915   sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 916   reportTable.appendChild(sitesCombinedRow);  
2611 29 Aug 14 nicklas 917
2611 29 Aug 14 nicklas 918   return reportTable;
2611 29 Aug 14 nicklas 919 }
2611 29 Aug 14 nicklas 920
2611 29 Aug 14 nicklas 921 function createConsentCountUnknownDateTable(report)
2611 29 Aug 14 nicklas 922 {
2611 29 Aug 14 nicklas 923   var reportTable = getReportTable();
2611 29 Aug 14 nicklas 924   var headerRow = document.createElement('tr');    
2611 29 Aug 14 nicklas 925   var subHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 926   var columnHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 927   
2611 29 Aug 14 nicklas 928   var numCols = 4;
2611 29 Aug 14 nicklas 929   var numDecimals = 0;
2611 29 Aug 14 nicklas 930   var headerText = '# Consent forms of different types for cases and blood samples with unknown consent date, as well as items with missing consents';
2611 29 Aug 14 nicklas 931   headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+5)));
2611 29 Aug 14 nicklas 932   
2611 29 Aug 14 nicklas 933   // Subheader    
2611 29 Aug 14 nicklas 934   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 3));
2611 29 Aug 14 nicklas 935   
2611 29 Aug 14 nicklas 936   subHeaderRow.appendChild(getTableCellElement('Yes', 'reportsubheader'));
2611 29 Aug 14 nicklas 937   subHeaderRow.appendChild(getTableCellElement('No', 'reportsubheader'));
2611 29 Aug 14 nicklas 938   subHeaderRow.appendChild(getTableCellElement('Not asked', 'reportsubheader'));
2611 29 Aug 14 nicklas 939   subHeaderRow.appendChild(getTableCellElement('Missing', 'reportsubheader'));
2611 29 Aug 14 nicklas 940   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 2));
2611 29 Aug 14 nicklas 941
2611 29 Aug 14 nicklas 942   // Columnsheader    
2611 29 Aug 14 nicklas 943   var siteHeader = getTableCellElement('Site', 'reportsubheader');      
2611 29 Aug 14 nicklas 944   var startDateHeader = getTableCellElement('Start date','reportsubheader');
2611 29 Aug 14 nicklas 945   var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
2611 29 Aug 14 nicklas 946   columnHeaderRow.appendChild(siteHeader);
2611 29 Aug 14 nicklas 947   columnHeaderRow.appendChild(startDateHeader);  
2611 29 Aug 14 nicklas 948   columnHeaderRow.appendChild(latestDateHeader);  
2611 29 Aug 14 nicklas 949   
2611 29 Aug 14 nicklas 950   columnHeaderRow.appendChild(getTableCellElement('(no date)', 'reportsubheader'));
2611 29 Aug 14 nicklas 951   columnHeaderRow.appendChild(getTableCellElement('(no date)', 'reportsubheader'));
2611 29 Aug 14 nicklas 952   columnHeaderRow.appendChild(getTableCellElement('(no date)', 'reportsubheader'));
2611 29 Aug 14 nicklas 953   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 954   columnHeaderRow.appendChild(getTableCellElement('Sum', 'reportsubheader'));
2611 29 Aug 14 nicklas 955   columnHeaderRow.appendChild(getTableCellElement('Total', 'reportsubheader'));
2611 29 Aug 14 nicklas 956
2611 29 Aug 14 nicklas 957   // Build table      
2611 29 Aug 14 nicklas 958   reportTable.appendChild(headerRow);
2611 29 Aug 14 nicklas 959   reportTable.appendChild(subHeaderRow);
2611 29 Aug 14 nicklas 960   reportTable.appendChild(columnHeaderRow);
2611 29 Aug 14 nicklas 961         
2611 29 Aug 14 nicklas 962   // Data rows      
2611 29 Aug 14 nicklas 963   addDataRowsToConsentTableUnknownDate(report, reportTable);
2611 29 Aug 14 nicklas 964     
2611 29 Aug 14 nicklas 965   // Add a row with the combined numbers for all sites
2611 29 Aug 14 nicklas 966   var sitesCombinedRow = document.createElement('tr');
2611 29 Aug 14 nicklas 967   sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
2611 29 Aug 14 nicklas 968   sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary', 2));
2611 29 Aug 14 nicklas 969   // Get combined numbers for all sites
2611 29 Aug 14 nicklas 970   var noDateOrMissingKey = 'noDateOrMissing';
2611 29 Aug 14 nicklas 971   var sumKey = 'sumKey';
2611 29 Aug 14 nicklas 972   var statistics = report.statistics;
2611 29 Aug 14 nicklas 973   var sitesCombined = statistics.sitesCombinedKey;
2611 29 Aug 14 nicklas 974   if (sitesCombined != null)
2611 29 Aug 14 nicklas 975   {
2611 29 Aug 14 nicklas 976     data = getJSONDataWithPercent(sitesCombined, 'yesDateUnknown', noDateOrMissingKey, numDecimals);
2611 29 Aug 14 nicklas 977     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 978     data = getJSONDataWithPercent(sitesCombined, 'noDateUnknown', noDateOrMissingKey, numDecimals);
2611 29 Aug 14 nicklas 979     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 980     data = getJSONDataWithPercent(sitesCombined, 'notAskedDateUnknown', noDateOrMissingKey, numDecimals);
2611 29 Aug 14 nicklas 981     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 982     data = getJSONDataWithPercent(sitesCombined, 'missing', noDateOrMissingKey, numDecimals);
2611 29 Aug 14 nicklas 983     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 984     // Add entry with total number of consents with chosen restrictions
2611 29 Aug 14 nicklas 985     var noDateOrMissingKey = 'noDateOrMissing';
2611 29 Aug 14 nicklas 986     data = getJSONData(sitesCombined, noDateOrMissingKey, 0);
2611 29 Aug 14 nicklas 987     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 988     // Add entry with total number of consents, regardless of restrictions
2611 29 Aug 14 nicklas 989     var totalKey = 'totalKey';
2611 29 Aug 14 nicklas 990     data = getJSONData(sitesCombined, totalKey, 0);
2611 29 Aug 14 nicklas 991     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 992   }
2611 29 Aug 14 nicklas 993   reportTable.appendChild(sitesCombinedRow);  
2611 29 Aug 14 nicklas 994
2611 29 Aug 14 nicklas 995   return reportTable;
2611 29 Aug 14 nicklas 996 }
2611 29 Aug 14 nicklas 997
2611 29 Aug 14 nicklas 998 function createOverviewReport(report)
2611 29 Aug 14 nicklas 999 {
2611 29 Aug 14 nicklas 1000   var reportTable = getReportTable();
2611 29 Aug 14 nicklas 1001   var bloodSampleFilter = report.bloodSampleFilter;
2611 29 Aug 14 nicklas 1002   var sdString = report.beginDate;
2611 29 Aug 14 nicklas 1003   var edString = report.endDate;
2611 29 Aug 14 nicklas 1004   var ldString = report.latestDate;
2611 29 Aug 14 nicklas 1005   var startDate = dateStrToDate(sdString);
2611 29 Aug 14 nicklas 1006   var endDate = dateStrToDate(edString);
2611 29 Aug 14 nicklas 1007   var latestDate = dateStrToDate(ldString);
2611 29 Aug 14 nicklas 1008
2611 29 Aug 14 nicklas 1009   var headerRow = document.createElement('tr');    
2611 29 Aug 14 nicklas 1010   var subHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1011   var subHeader2Row = document.createElement('tr');
2611 29 Aug 14 nicklas 1012   var columnHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1013   
2611 29 Aug 14 nicklas 1014   var numCols = 7;
2611 29 Aug 14 nicklas 1015   var numDecimals = 0;
2611 29 Aug 14 nicklas 1016   var headerText = 'Number of items of different kinds';
2611 29 Aug 14 nicklas 1017   if (bloodSampleFilter != null && bloodSampleFilter != 'none')
2611 29 Aug 14 nicklas 1018   {
2611 29 Aug 14 nicklas 1019     bloodSampleFilterDisplayText = getBloodSampleFilterDisplayText(bloodSampleFilter);
2611 29 Aug 14 nicklas 1020     headerText += ', blood sample type = \'' + bloodSampleFilterDisplayText + '\'';
2611 29 Aug 14 nicklas 1021   }
2611 29 Aug 14 nicklas 1022   var startDateStr = addHyphensToDateString(sdString);
2611 29 Aug 14 nicklas 1023   var endDateStr = addHyphensToDateString(edString);
2611 29 Aug 14 nicklas 1024   var latestDateStr = addHyphensToDateString(ldString);
2611 29 Aug 14 nicklas 1025   headerText += ' (betweeen ' + startDateStr + ' and ' + endDateStr + ')';
2611 29 Aug 14 nicklas 1026   if (latestDate != null)
2611 29 Aug 14 nicklas 1027   {
2611 29 Aug 14 nicklas 1028       headerText += '\nLast registration ' + latestDateStr;
2611 29 Aug 14 nicklas 1029   }
2611 29 Aug 14 nicklas 1030   headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+3)));
2611 29 Aug 14 nicklas 1031   
2611 29 Aug 14 nicklas 1032   // Subheader
2611 29 Aug 14 nicklas 1033   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 3));
2611 29 Aug 14 nicklas 1034   
2611 29 Aug 14 nicklas 1035   subHeaderRow.appendChild(getTableCellElement('Patients', 'reportsubheader'));
2611 29 Aug 14 nicklas 1036   subHeaderRow.appendChild(getTableCellElement('Blood', 'reportsubheader'));
2611 29 Aug 14 nicklas 1037   subHeaderRow.appendChild(getTableCellElement('Blood', 'reportsubheader'));
2611 29 Aug 14 nicklas 1038   subHeaderRow.appendChild(getTableCellElement('Specimens', 'reportsubheader'));
2611 29 Aug 14 nicklas 1039   subHeaderRow.appendChild(getTableCellElement('No specimens', 'reportsubheader'));
2611 29 Aug 14 nicklas 1040   subHeaderRow.appendChild(getTableCellElement('Consents', 'reportsubheader'));
2611 29 Aug 14 nicklas 1041   subHeaderRow.appendChild(getTableCellElement('Consents', 'reportsubheader'));
2611 29 Aug 14 nicklas 1042
2611 29 Aug 14 nicklas 1043   // Subheader 2
2611 29 Aug 14 nicklas 1044   subHeader2Row.appendChild(getTableCellElement('', 'reportsubheader', 3));
2611 29 Aug 14 nicklas 1045   
2611 29 Aug 14 nicklas 1046   subHeader2Row.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1047   subHeader2Row.appendChild(getTableCellElement('samples', 'reportsubheader'));
2611 29 Aug 14 nicklas 1048   subHeader2Row.appendChild(getTableCellElement('samples', 'reportsubheader'));
2611 29 Aug 14 nicklas 1049   subHeader2Row.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1050   subHeader2Row.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1051   subHeader2Row.appendChild(getTableCellElement('(Yes)', 'reportsubheader'));
2611 29 Aug 14 nicklas 1052   subHeader2Row.appendChild(getTableCellElement('missing', 'reportsubheader'));
2611 29 Aug 14 nicklas 1053
2611 29 Aug 14 nicklas 1054   // Columnsheader    
2611 29 Aug 14 nicklas 1055   var siteHeader = getTableCellElement('Site', 'reportsubheader');      
2611 29 Aug 14 nicklas 1056   var startDateHeader = getTableCellElement('Start date','reportsubheader');
2611 29 Aug 14 nicklas 1057   var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
2611 29 Aug 14 nicklas 1058   columnHeaderRow.appendChild(siteHeader);
2611 29 Aug 14 nicklas 1059   columnHeaderRow.appendChild(startDateHeader);  
2611 29 Aug 14 nicklas 1060   columnHeaderRow.appendChild(latestDateHeader);  
2611 29 Aug 14 nicklas 1061   
2611 29 Aug 14 nicklas 1062   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1063   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1064   columnHeaderRow.appendChild(getTableCellElement('follow-up', 'reportsubheader'));
2611 29 Aug 14 nicklas 1065   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1066   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1067   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1068   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1069
2611 29 Aug 14 nicklas 1070   // Build table      
2611 29 Aug 14 nicklas 1071   reportTable.appendChild(headerRow);
2611 29 Aug 14 nicklas 1072   reportTable.appendChild(subHeaderRow);
2611 29 Aug 14 nicklas 1073   reportTable.appendChild(subHeader2Row);
2611 29 Aug 14 nicklas 1074   reportTable.appendChild(columnHeaderRow);
2611 29 Aug 14 nicklas 1075         
2611 29 Aug 14 nicklas 1076   // Data rows      
2611 29 Aug 14 nicklas 1077   addDataRowsToOverviewTable(report, reportTable);
2611 29 Aug 14 nicklas 1078     
2611 29 Aug 14 nicklas 1079   // Add a row with the combined numbers for all sites for each period
2611 29 Aug 14 nicklas 1080   var sitesCombinedRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1081   sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
2611 29 Aug 14 nicklas 1082   sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary', 2));
2611 29 Aug 14 nicklas 1083   // Get combined numbers for all sites for each period
2611 29 Aug 14 nicklas 1084   var noDateKey = 'noDate';
2611 29 Aug 14 nicklas 1085   var sumKey = 'sumKey';
2611 29 Aug 14 nicklas 1086   var statistics = report.statistics;
2611 29 Aug 14 nicklas 1087   // Get values for use in summary section
2611 29 Aug 14 nicklas 1088   numPatientsNoSamples = statistics.patientNoSamples;
2611 29 Aug 14 nicklas 1089   var sitesCombined = statistics.sitesCombinedKey;
2611 29 Aug 14 nicklas 1090   if (sitesCombined != null)
2611 29 Aug 14 nicklas 1091   {
2611 29 Aug 14 nicklas 1092     data = getJSONData(sitesCombined, 'patient');
2611 29 Aug 14 nicklas 1093     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1094     data = getJSONData(sitesCombined, 'bloodSample');
2611 29 Aug 14 nicklas 1095     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1096     data = getJSONData(sitesCombined, 'bloodSampleFollowUp');
2611 29 Aug 14 nicklas 1097     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1098     data = getJSONData(sitesCombined, 'specimen');
2611 29 Aug 14 nicklas 1099     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1100     data = getJSONData(sitesCombined, 'noSpecimen');
2611 29 Aug 14 nicklas 1101     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1102     data = getJSONData(sitesCombined, 'consentYes');
2611 29 Aug 14 nicklas 1103     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1104     data = getJSONData(sitesCombined, 'consentMissing');
2611 29 Aug 14 nicklas 1105     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1106   }
2611 29 Aug 14 nicklas 1107   reportTable.appendChild(sitesCombinedRow);  
2611 29 Aug 14 nicklas 1108
2611 29 Aug 14 nicklas 1109   return reportTable;
2611 29 Aug 14 nicklas 1110 }
2611 29 Aug 14 nicklas 1111
2611 29 Aug 14 nicklas 1112 function createOverviewPatientWithSampleTable(report)
2611 29 Aug 14 nicklas 1113 {
2611 29 Aug 14 nicklas 1114   var reportTable = getReportTable();
2611 29 Aug 14 nicklas 1115   var bloodSampleFilter = report.bloodSampleFilter;
2611 29 Aug 14 nicklas 1116   var sdString = report.beginDate;
2611 29 Aug 14 nicklas 1117   var edString = report.endDate;
2611 29 Aug 14 nicklas 1118   var ldString = report.latestDate;
2611 29 Aug 14 nicklas 1119   var startDate = dateStrToDate(sdString);
2611 29 Aug 14 nicklas 1120   var endDate = dateStrToDate(edString);
2611 29 Aug 14 nicklas 1121   var latestDate = dateStrToDate(ldString);
2611 29 Aug 14 nicklas 1122
2611 29 Aug 14 nicklas 1123   var headerRow = document.createElement('tr');    
2611 29 Aug 14 nicklas 1124   var subHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1125   var subHeader2Row = document.createElement('tr');
2611 29 Aug 14 nicklas 1126   var columnHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1127   
2611 29 Aug 14 nicklas 1128   var numCols = 7;
2611 29 Aug 14 nicklas 1129   var numDecimals = 0;
2611 29 Aug 14 nicklas 1130   var headerText = 'Patients having a sample type item';
2611 29 Aug 14 nicklas 1131   if (bloodSampleFilter != null && bloodSampleFilter != 'none')
2611 29 Aug 14 nicklas 1132   {
2611 29 Aug 14 nicklas 1133     bloodSampleFilterDisplayText = getBloodSampleFilterDisplayText(bloodSampleFilter);
2611 29 Aug 14 nicklas 1134     headerText += ', blood sample type = \'' + bloodSampleFilterDisplayText + '\'';
2611 29 Aug 14 nicklas 1135   }
2611 29 Aug 14 nicklas 1136   var startDateStr = addHyphensToDateString(sdString);
2611 29 Aug 14 nicklas 1137   var endDateStr = addHyphensToDateString(edString);
2611 29 Aug 14 nicklas 1138   var latestDateStr = addHyphensToDateString(ldString);
2611 29 Aug 14 nicklas 1139   headerText += ' (betweeen ' + startDateStr + ' and ' + endDateStr + ')';
2611 29 Aug 14 nicklas 1140   headerText += '\nColumn entries are non-exclusive, i.e. a patient may be represented in several columns';
2611 29 Aug 14 nicklas 1141   headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+3)));
2611 29 Aug 14 nicklas 1142   
2611 29 Aug 14 nicklas 1143   // Subheader
2611 29 Aug 14 nicklas 1144   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 3));
2611 29 Aug 14 nicklas 1145   
2611 29 Aug 14 nicklas 1146   subHeaderRow.appendChild(getTableCellElement('Patients', 'reportsubheader'));
2611 29 Aug 14 nicklas 1147   subHeaderRow.appendChild(getTableCellElement('with', 'reportsubheader'));
2611 29 Aug 14 nicklas 1148   subHeaderRow.appendChild(getTableCellElement('with', 'reportsubheader'));
2611 29 Aug 14 nicklas 1149   subHeaderRow.appendChild(getTableCellElement('with', 'reportsubheader'));
2611 29 Aug 14 nicklas 1150   subHeaderRow.appendChild(getTableCellElement('with', 'reportsubheader'));
2611 29 Aug 14 nicklas 1151   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1152   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1153
2611 29 Aug 14 nicklas 1154   // Subheader 2
2611 29 Aug 14 nicklas 1155   subHeader2Row.appendChild(getTableCellElement('', 'reportsubheader', 3));
2611 29 Aug 14 nicklas 1156   
2611 29 Aug 14 nicklas 1157   subHeader2Row.appendChild(getTableCellElement('total', 'reportsubheader'));
2611 29 Aug 14 nicklas 1158   subHeader2Row.appendChild(getTableCellElement('blood', 'reportsubheader'));
2611 29 Aug 14 nicklas 1159   subHeader2Row.appendChild(getTableCellElement('follow-up', 'reportsubheader'));
2611 29 Aug 14 nicklas 1160   subHeader2Row.appendChild(getTableCellElement('specimen(s)', 'reportsubheader'));
2611 29 Aug 14 nicklas 1161   subHeader2Row.appendChild(getTableCellElement('no specimen(s)', 'reportsubheader'));
2611 29 Aug 14 nicklas 1162   subHeader2Row.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1163   subHeader2Row.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1164
2611 29 Aug 14 nicklas 1165   // Columnsheader    
2611 29 Aug 14 nicklas 1166   var siteHeader = getTableCellElement('Site', 'reportsubheader');      
2611 29 Aug 14 nicklas 1167   var startDateHeader = getTableCellElement('Start date','reportsubheader');
2611 29 Aug 14 nicklas 1168   var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
2611 29 Aug 14 nicklas 1169   columnHeaderRow.appendChild(siteHeader);
2611 29 Aug 14 nicklas 1170   columnHeaderRow.appendChild(startDateHeader);  
2611 29 Aug 14 nicklas 1171   columnHeaderRow.appendChild(latestDateHeader);  
2611 29 Aug 14 nicklas 1172   
2611 29 Aug 14 nicklas 1173   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1174   columnHeaderRow.appendChild(getTableCellElement('sample(s)', 'reportsubheader'));
2611 29 Aug 14 nicklas 1175   columnHeaderRow.appendChild(getTableCellElement('blood s.', 'reportsubheader'));
2611 29 Aug 14 nicklas 1176   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1177   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1178   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1179   columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1180
2611 29 Aug 14 nicklas 1181   // Build table      
2611 29 Aug 14 nicklas 1182   reportTable.appendChild(headerRow);
2611 29 Aug 14 nicklas 1183   reportTable.appendChild(subHeaderRow);
2611 29 Aug 14 nicklas 1184   reportTable.appendChild(subHeader2Row);
2611 29 Aug 14 nicklas 1185   reportTable.appendChild(columnHeaderRow);
2611 29 Aug 14 nicklas 1186         
2611 29 Aug 14 nicklas 1187   // Data rows      
2611 29 Aug 14 nicklas 1188   addDataRowsToOverviewPatientWithSampleTable(report, reportTable);
2611 29 Aug 14 nicklas 1189     
2611 29 Aug 14 nicklas 1190   // Add a row with the combined numbers for all sites for each period
2611 29 Aug 14 nicklas 1191   var sitesCombinedRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1192   sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
2611 29 Aug 14 nicklas 1193   sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary', 2));
2611 29 Aug 14 nicklas 1194   // Get combined numbers for all sites for each period
2611 29 Aug 14 nicklas 1195   var noDateKey = 'noDate';
2611 29 Aug 14 nicklas 1196   var sumKey = 'sumKey';
2611 29 Aug 14 nicklas 1197   var statistics = report.statistics;
2611 29 Aug 14 nicklas 1198   // Get values for use in summary section
2611 29 Aug 14 nicklas 1199   numPatientsNoSamples = statistics.patientNoSamples;
2611 29 Aug 14 nicklas 1200   var sitesCombined = statistics.sitesCombinedKey;
2611 29 Aug 14 nicklas 1201   if (sitesCombined != null)
2611 29 Aug 14 nicklas 1202   {
2611 29 Aug 14 nicklas 1203     data = getJSONData(sitesCombined, 'patient');
2611 29 Aug 14 nicklas 1204     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1205     data = getJSONData(sitesCombined, 'patientWithBloodSample');
2611 29 Aug 14 nicklas 1206     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1207     data = getJSONData(sitesCombined, 'patientWithFollowUpBloodSample');
2611 29 Aug 14 nicklas 1208     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1209     data = getJSONData(sitesCombined, 'patientWithSpecimen');
2611 29 Aug 14 nicklas 1210     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1211     data = getJSONData(sitesCombined, 'patientWithNoSpecimen');
2611 29 Aug 14 nicklas 1212     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1213   }
2611 29 Aug 14 nicklas 1214   reportTable.appendChild(sitesCombinedRow);  
2611 29 Aug 14 nicklas 1215
2611 29 Aug 14 nicklas 1216   return reportTable;
2611 29 Aug 14 nicklas 1217 }
2611 29 Aug 14 nicklas 1218
2611 29 Aug 14 nicklas 1219 function createOverviewPatientDetailedTable(report)
2611 29 Aug 14 nicklas 1220 {
2611 29 Aug 14 nicklas 1221   var reportTable = getReportTable();
2611 29 Aug 14 nicklas 1222   var bloodSampleFilter = report.bloodSampleFilter;
2611 29 Aug 14 nicklas 1223   var sdString = report.beginDate;
2611 29 Aug 14 nicklas 1224   var edString = report.endDate;
2611 29 Aug 14 nicklas 1225   var ldString = report.latestDate;
2611 29 Aug 14 nicklas 1226   var startDate = dateStrToDate(sdString);
2611 29 Aug 14 nicklas 1227   var endDate = dateStrToDate(edString);
2611 29 Aug 14 nicklas 1228
2611 29 Aug 14 nicklas 1229   var headerRow = document.createElement('tr');    
2611 29 Aug 14 nicklas 1230   var subHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1231   var subHeader2Row = document.createElement('tr');
2611 29 Aug 14 nicklas 1232   var columnHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1233   
2611 29 Aug 14 nicklas 1234   var numCols = 8;
2611 29 Aug 14 nicklas 1235   var numDecimals = 0;
2611 29 Aug 14 nicklas 1236   var headerText = 'Patient records of different kinds';
2611 29 Aug 14 nicklas 1237   if (bloodSampleFilter != null && bloodSampleFilter != 'none')
2611 29 Aug 14 nicklas 1238   {
2611 29 Aug 14 nicklas 1239     bloodSampleFilterDisplayText = getBloodSampleFilterDisplayText(bloodSampleFilter);
2611 29 Aug 14 nicklas 1240     headerText += ', blood sample type = \'' + bloodSampleFilterDisplayText + '\'';
2611 29 Aug 14 nicklas 1241   }
2611 29 Aug 14 nicklas 1242   var startDateStr = addHyphensToDateString(sdString);
2611 29 Aug 14 nicklas 1243   var endDateStr = addHyphensToDateString(edString);
2611 29 Aug 14 nicklas 1244   var latestDateStr = addHyphensToDateString(ldString);
2611 29 Aug 14 nicklas 1245   headerText += ' (betweeen ' + startDateStr + ' and ' + endDateStr + ')';
2611 29 Aug 14 nicklas 1246 /*
2611 29 Aug 14 nicklas 1247   if (latestDate != null)
2611 29 Aug 14 nicklas 1248   {
2611 29 Aug 14 nicklas 1249       headerText += '\nLast registration ' + latestDateStr;
2611 29 Aug 14 nicklas 1250   }
2611 29 Aug 14 nicklas 1251 */
2611 29 Aug 14 nicklas 1252   headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+2)));
2611 29 Aug 14 nicklas 1253   
2611 29 Aug 14 nicklas 1254   // Subheader
2611 29 Aug 14 nicklas 1255   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 2));
2611 29 Aug 14 nicklas 1256   
2611 29 Aug 14 nicklas 1257   subHeaderRow.appendChild(getTableCellElement('Patients', 'reportsubheader'));
2611 29 Aug 14 nicklas 1258   subHeaderRow.appendChild(getTableCellElement('Patients', 'reportsubheader'));
2611 29 Aug 14 nicklas 1259   subHeaderRow.appendChild(getTableCellElement('Patients', 'reportsubheader'));
2611 29 Aug 14 nicklas 1260   subHeaderRow.appendChild(getTableCellElement('Patients', 'reportsubheader'));
2611 29 Aug 14 nicklas 1261   subHeaderRow.appendChild(getTableCellElement('Patients', 'reportsubheader'));
2611 29 Aug 14 nicklas 1262   subHeaderRow.appendChild(getTableCellElement('Patients', 'reportsubheader'));
2611 29 Aug 14 nicklas 1263   subHeaderRow.appendChild(getTableCellElement('Patients', 'reportsubheader'));
2611 29 Aug 14 nicklas 1264   //subHeaderRow.appendChild(getTableCellElement('Patients', 'reportsubheader'));
2611 29 Aug 14 nicklas 1265   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1266
2611 29 Aug 14 nicklas 1267   // Subheader 2
2611 29 Aug 14 nicklas 1268   subHeader2Row.appendChild(getTableCellElement('', 'reportsubheader', 2));
2611 29 Aug 14 nicklas 1269   
2611 29 Aug 14 nicklas 1270   subHeader2Row.appendChild(getTableCellElement('(blood', 'reportsubheader'));
2611 29 Aug 14 nicklas 1271   subHeader2Row.appendChild(getTableCellElement('(spec.', 'reportsubheader'));
2611 29 Aug 14 nicklas 1272   subHeader2Row.appendChild(getTableCellElement('(no spec.', 'reportsubheader'));
2611 29 Aug 14 nicklas 1273   subHeader2Row.appendChild(getTableCellElement('(blood and', 'reportsubheader'));
2611 29 Aug 14 nicklas 1274   subHeader2Row.appendChild(getTableCellElement('(blood and', 'reportsubheader'));
2611 29 Aug 14 nicklas 1275   subHeader2Row.appendChild(getTableCellElement('(spec. and', 'reportsubheader'));
2611 29 Aug 14 nicklas 1276   subHeader2Row.appendChild(getTableCellElement('(blood, spec.,', 'reportsubheader'));
2611 29 Aug 14 nicklas 1277   //subHeader2Row.appendChild(getTableCellElement('(no samples)', 'reportsubheader'));
2611 29 Aug 14 nicklas 1278   subHeader2Row.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1279
2611 29 Aug 14 nicklas 1280   // Columnsheader    
2611 29 Aug 14 nicklas 1281   var siteHeader = getTableCellElement('Site', 'reportsubheader');      
2611 29 Aug 14 nicklas 1282   var startDateHeader = getTableCellElement('Start date','reportsubheader');
2611 29 Aug 14 nicklas 1283   //var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
2611 29 Aug 14 nicklas 1284   columnHeaderRow.appendChild(siteHeader);
2611 29 Aug 14 nicklas 1285   columnHeaderRow.appendChild(startDateHeader);  
2611 29 Aug 14 nicklas 1286   //columnHeaderRow.appendChild(latestDateHeader);  
2611 29 Aug 14 nicklas 1287   
2611 29 Aug 14 nicklas 1288   columnHeaderRow.appendChild(getTableCellElement('only)', 'reportsubheader'));
2611 29 Aug 14 nicklas 1289   columnHeaderRow.appendChild(getTableCellElement('only)', 'reportsubheader'));
2611 29 Aug 14 nicklas 1290   columnHeaderRow.appendChild(getTableCellElement('only)', 'reportsubheader'));
2611 29 Aug 14 nicklas 1291   columnHeaderRow.appendChild(getTableCellElement('specimens)', 'reportsubheader'));
2611 29 Aug 14 nicklas 1292   columnHeaderRow.appendChild(getTableCellElement('no spec.)', 'reportsubheader'));
2611 29 Aug 14 nicklas 1293   columnHeaderRow.appendChild(getTableCellElement('no spec.)', 'reportsubheader'));
2611 29 Aug 14 nicklas 1294   columnHeaderRow.appendChild(getTableCellElement('and no spec.)', 'reportsubheader'));
2611 29 Aug 14 nicklas 1295   //columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1296
2611 29 Aug 14 nicklas 1297   columnHeaderRow.appendChild(getTableCellElement('Sum', 'reportsubheader'));
2611 29 Aug 14 nicklas 1298
2611 29 Aug 14 nicklas 1299   // Build table      
2611 29 Aug 14 nicklas 1300   reportTable.appendChild(headerRow);
2611 29 Aug 14 nicklas 1301   reportTable.appendChild(subHeaderRow);
2611 29 Aug 14 nicklas 1302   reportTable.appendChild(subHeader2Row);
2611 29 Aug 14 nicklas 1303   reportTable.appendChild(columnHeaderRow);
2611 29 Aug 14 nicklas 1304         
2611 29 Aug 14 nicklas 1305   // Data rows      
2611 29 Aug 14 nicklas 1306   addDataRowsToOverviewPatientDetailedTable(report, reportTable);
2611 29 Aug 14 nicklas 1307     
2611 29 Aug 14 nicklas 1308   // Add a row with the combined numbers for all sites
2611 29 Aug 14 nicklas 1309   var sitesCombinedRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1310   sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
2611 29 Aug 14 nicklas 1311   sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary'));
2611 29 Aug 14 nicklas 1312   // Get combined numbers for all sites
2611 29 Aug 14 nicklas 1313   var noDateKey = 'noDate';
2611 29 Aug 14 nicklas 1314   var sumKey = 'sumKey';
2611 29 Aug 14 nicklas 1315   var statistics = report.statistics;
2611 29 Aug 14 nicklas 1316   // Get values for use in summary section
2611 29 Aug 14 nicklas 1317   numPatientsNoSamples = statistics.patientNoSamples;
2611 29 Aug 14 nicklas 1318   var sitesCombined = statistics.sitesCombinedKey;
2611 29 Aug 14 nicklas 1319   if (sitesCombined != null)
2611 29 Aug 14 nicklas 1320   {
2611 29 Aug 14 nicklas 1321     data = getJSONData(sitesCombined, 'patientBloodSampleOnly');
2611 29 Aug 14 nicklas 1322     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1323     data = getJSONData(sitesCombined, 'patientSpecimenOnly');
2611 29 Aug 14 nicklas 1324     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1325     data = getJSONData(sitesCombined, 'patientNoSpecimenOnly');
2611 29 Aug 14 nicklas 1326     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1327     data = getJSONData(sitesCombined, 'patientBloodSampleAndSpecimen');
2611 29 Aug 14 nicklas 1328     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1329     data = getJSONData(sitesCombined, 'patientBloodSampleAndNoSpecimen');
2611 29 Aug 14 nicklas 1330     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1331     data = getJSONData(sitesCombined, 'patientSpecimenAndNoSpecimen');
2611 29 Aug 14 nicklas 1332     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1333     data = getJSONData(sitesCombined, 'patientBloodSampleAndSpecimenAndNoSpecimen');
2611 29 Aug 14 nicklas 1334     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1335     //data = getJSONData(sitesCombined, 'patientNoSamples');
2611 29 Aug 14 nicklas 1336     //sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1337     data = getJSONData(sitesCombined, 'sumKey');
2611 29 Aug 14 nicklas 1338     sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1339   }
2611 29 Aug 14 nicklas 1340   reportTable.appendChild(sitesCombinedRow);  
2611 29 Aug 14 nicklas 1341
2611 29 Aug 14 nicklas 1342   return reportTable;
2611 29 Aug 14 nicklas 1343 }
2611 29 Aug 14 nicklas 1344
2611 29 Aug 14 nicklas 1345 function createMissingSampleDataReport(report)
2611 29 Aug 14 nicklas 1346 {
2611 29 Aug 14 nicklas 1347   var reportTable = getReportTable();
2611 29 Aug 14 nicklas 1348   var sdString = report.beginDate;
2611 29 Aug 14 nicklas 1349   var edString = report.endDate;
2611 29 Aug 14 nicklas 1350   var ldString = report.latestDate;
2611 29 Aug 14 nicklas 1351   var startDate = dateStrToDate(sdString);
2611 29 Aug 14 nicklas 1352   var endDate = dateStrToDate(edString);
2611 29 Aug 14 nicklas 1353   var latestDate = dateStrToDate(ldString);
2611 29 Aug 14 nicklas 1354
2611 29 Aug 14 nicklas 1355   var sampleType = report.sampleType;
2611 29 Aug 14 nicklas 1356   var bloodSampleFilter = report.bloodSampleFilter;
2611 29 Aug 14 nicklas 1357   var permissionDeniedForPatientName = report.permissionDeniedForPatientName;
2611 29 Aug 14 nicklas 1358   var permissionDeniedForPad = report.permissionDeniedForPad;
2611 29 Aug 14 nicklas 1359
2611 29 Aug 14 nicklas 1360   var headerRow = document.createElement('tr');    
2611 29 Aug 14 nicklas 1361   var subHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1362   var subHeader2Row = document.createElement('tr');
2611 29 Aug 14 nicklas 1363   var columnHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1364   
2611 29 Aug 14 nicklas 1365   var numCols = 5;
2611 29 Aug 14 nicklas 1366   if (sampleType == 'specimen')
2611 29 Aug 14 nicklas 1367   {
2611 29 Aug 14 nicklas 1368     numCols = 5;
2611 29 Aug 14 nicklas 1369   }
2611 29 Aug 14 nicklas 1370   else if (sampleType == 'nospecimen')
2611 29 Aug 14 nicklas 1371   {
2611 29 Aug 14 nicklas 1372     numCols = 4;
2611 29 Aug 14 nicklas 1373   }
2611 29 Aug 14 nicklas 1374   else if (sampleType == 'blood')
2611 29 Aug 14 nicklas 1375   {
2611 29 Aug 14 nicklas 1376     numCols = 3;
2611 29 Aug 14 nicklas 1377   }
2611 29 Aug 14 nicklas 1378   var numDecimals = 0;
2611 29 Aug 14 nicklas 1379   var headerText = 'Number of missing specimen items of different kinds';
2611 29 Aug 14 nicklas 1380   if ('nospecimen' == sampleType)
2611 29 Aug 14 nicklas 1381   {
2611 29 Aug 14 nicklas 1382     headerText = 'Number of missing "no specimen" items of different kinds';
2611 29 Aug 14 nicklas 1383   }
2611 29 Aug 14 nicklas 1384   else if ('blood' == sampleType)
2611 29 Aug 14 nicklas 1385   {
2611 29 Aug 14 nicklas 1386     headerText = 'Number of missing blood sample items of different kinds';
2611 29 Aug 14 nicklas 1387     if (bloodSampleFilter != null && bloodSampleFilter != 'none')
2611 29 Aug 14 nicklas 1388     {
2611 29 Aug 14 nicklas 1389       bloodSampleFilterDisplayText = getBloodSampleFilterDisplayText(bloodSampleFilter);
2611 29 Aug 14 nicklas 1390       headerText += ', blood sample type = \'' + bloodSampleFilterDisplayText + '\'';
2611 29 Aug 14 nicklas 1391     }
2611 29 Aug 14 nicklas 1392   }
2611 29 Aug 14 nicklas 1393   var startDateStr = addHyphensToDateString(sdString);
2611 29 Aug 14 nicklas 1394   var endDateStr = addHyphensToDateString(edString);
2611 29 Aug 14 nicklas 1395   var latestDateStr = addHyphensToDateString(ldString);
2611 29 Aug 14 nicklas 1396   headerText += ' (betweeen ' + startDateStr + ' and ' + endDateStr + ')';
2611 29 Aug 14 nicklas 1397   if (latestDate != null)
2611 29 Aug 14 nicklas 1398   {
2611 29 Aug 14 nicklas 1399       headerText += '\nLast registration ' + latestDateStr;
2611 29 Aug 14 nicklas 1400   }
2611 29 Aug 14 nicklas 1401   headerRow.appendChild(getTableCellElement(headerText, 'reportheader', (numCols+3)));
2611 29 Aug 14 nicklas 1402   
2611 29 Aug 14 nicklas 1403   // Subheader
2611 29 Aug 14 nicklas 1404   subHeaderRow.appendChild(getTableCellElement('', 'reportsubheader', 3));
2611 29 Aug 14 nicklas 1405   
2611 29 Aug 14 nicklas 1406   subHeaderRow.appendChild(getTableCellElement('Patient', 'reportsubheader'));
2611 29 Aug 14 nicklas 1407   if (sampleType == 'specimen')
2611 29 Aug 14 nicklas 1408   {
2611 29 Aug 14 nicklas 1409     subHeaderRow.appendChild(getTableCellElement('PAD', 'reportsubheader'));
2611 29 Aug 14 nicklas 1410     subHeaderRow.appendChild(getTableCellElement('Laterality', 'reportsubheader'));
2611 29 Aug 14 nicklas 1411     subHeaderRow.appendChild(getTableCellElement('Sampling', 'reportsubheader'));
2611 29 Aug 14 nicklas 1412     subHeaderRow.appendChild(getTableCellElement('RNALater', 'reportsubheader'));
2611 29 Aug 14 nicklas 1413   }
2611 29 Aug 14 nicklas 1414   else if (sampleType == 'nospecimen')
2611 29 Aug 14 nicklas 1415   {
2611 29 Aug 14 nicklas 1416     subHeaderRow.appendChild(getTableCellElement('PAD', 'reportsubheader'));
2611 29 Aug 14 nicklas 1417     subHeaderRow.appendChild(getTableCellElement('Laterality', 'reportsubheader'));
2611 29 Aug 14 nicklas 1418     subHeaderRow.appendChild(getTableCellElement('Sampling', 'reportsubheader'));
2611 29 Aug 14 nicklas 1419   }
2611 29 Aug 14 nicklas 1420   else if (sampleType == 'blood')
2611 29 Aug 14 nicklas 1421   {
2611 29 Aug 14 nicklas 1422     subHeaderRow.appendChild(getTableCellElement('Blood sampling', 'reportsubheader'));
2611 29 Aug 14 nicklas 1423     subHeaderRow.appendChild(getTableCellElement('Blood freezer', 'reportsubheader'));
2611 29 Aug 14 nicklas 1424   }
2611 29 Aug 14 nicklas 1425
2611 29 Aug 14 nicklas 1426   // Columnsheader    
2611 29 Aug 14 nicklas 1427   var siteHeader = getTableCellElement('Site', 'reportsubheader');      
2611 29 Aug 14 nicklas 1428   var startDateHeader = getTableCellElement('Start date','reportsubheader');
2611 29 Aug 14 nicklas 1429   var latestDateHeader = getTableCellElement('Latest date','reportsubheader');
2611 29 Aug 14 nicklas 1430   columnHeaderRow.appendChild(siteHeader);
2611 29 Aug 14 nicklas 1431   columnHeaderRow.appendChild(startDateHeader);  
2611 29 Aug 14 nicklas 1432   columnHeaderRow.appendChild(latestDateHeader);  
2611 29 Aug 14 nicklas 1433   
2611 29 Aug 14 nicklas 1434   columnHeaderRow.appendChild(getTableCellElement('name', 'reportsubheader'));
2611 29 Aug 14 nicklas 1435   if (sampleType == 'specimen')
2611 29 Aug 14 nicklas 1436   {
2611 29 Aug 14 nicklas 1437     columnHeaderRow.appendChild(getTableCellElement('reference', 'reportsubheader'));
2611 29 Aug 14 nicklas 1438     columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1439     columnHeaderRow.appendChild(getTableCellElement('date', 'reportsubheader'));
2611 29 Aug 14 nicklas 1440     columnHeaderRow.appendChild(getTableCellElement('date', 'reportsubheader'));
2611 29 Aug 14 nicklas 1441   }
2611 29 Aug 14 nicklas 1442   else if (sampleType == 'nospecimen')
2611 29 Aug 14 nicklas 1443   {
2611 29 Aug 14 nicklas 1444     columnHeaderRow.appendChild(getTableCellElement('reference', 'reportsubheader'));
2611 29 Aug 14 nicklas 1445     columnHeaderRow.appendChild(getTableCellElement('', 'reportsubheader'));
2611 29 Aug 14 nicklas 1446     columnHeaderRow.appendChild(getTableCellElement('date', 'reportsubheader'));
2611 29 Aug 14 nicklas 1447   }
2611 29 Aug 14 nicklas 1448   else if (sampleType == 'blood')
2611 29 Aug 14 nicklas 1449   {
2611 29 Aug 14 nicklas 1450     columnHeaderRow.appendChild(getTableCellElement('date', 'reportsubheader'));
2611 29 Aug 14 nicklas 1451     columnHeaderRow.appendChild(getTableCellElement('date', 'reportsubheader'));
2611 29 Aug 14 nicklas 1452   }
2611 29 Aug 14 nicklas 1453
2611 29 Aug 14 nicklas 1454   // Build table      
2611 29 Aug 14 nicklas 1455   reportTable.appendChild(headerRow);
2611 29 Aug 14 nicklas 1456   reportTable.appendChild(subHeaderRow);
2611 29 Aug 14 nicklas 1457   reportTable.appendChild(columnHeaderRow);
2611 29 Aug 14 nicklas 1458         
2611 29 Aug 14 nicklas 1459   // Data rows      
2611 29 Aug 14 nicklas 1460   addDataRowsToMissingSampleDataTable(report, reportTable);
2611 29 Aug 14 nicklas 1461     
2611 29 Aug 14 nicklas 1462   // Add a row with the combined numbers for all sites for each period
2611 29 Aug 14 nicklas 1463   var sitesCombinedRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1464   sitesCombinedRow.appendChild(getTableCellElement('Sites combined', 'colsummary'));
2611 29 Aug 14 nicklas 1465   sitesCombinedRow.appendChild(getTableCellElement('', 'colsummary', 2));
2611 29 Aug 14 nicklas 1466   // Get combined numbers for all sites for each period
2611 29 Aug 14 nicklas 1467   var noDateKey = 'noDate';
2611 29 Aug 14 nicklas 1468   var sumKey = 'sumKey';
2611 29 Aug 14 nicklas 1469   var statistics = report.statistics;
2611 29 Aug 14 nicklas 1470   var sitesCombined = statistics.sitesCombinedKey;
2611 29 Aug 14 nicklas 1471   if (sitesCombined != null)
2611 29 Aug 14 nicklas 1472   {
2611 29 Aug 14 nicklas 1473     if (!permissionDeniedForPatientName)
2611 29 Aug 14 nicklas 1474     {
2611 29 Aug 14 nicklas 1475       data = getJSONData(sitesCombined, 'missingPatientName');
2611 29 Aug 14 nicklas 1476       sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1477     }
2611 29 Aug 14 nicklas 1478     else
2611 29 Aug 14 nicklas 1479     {
2611 29 Aug 14 nicklas 1480       data = '-';
2611 29 Aug 14 nicklas 1481       sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1482     }
2611 29 Aug 14 nicklas 1483     if (sampleType == 'specimen')
2611 29 Aug 14 nicklas 1484     {
2611 29 Aug 14 nicklas 1485       if (!permissionDeniedForPad)
2611 29 Aug 14 nicklas 1486       {
2611 29 Aug 14 nicklas 1487         data = getJSONData(sitesCombined, 'missingPadReference');
2611 29 Aug 14 nicklas 1488         sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1489       }
2611 29 Aug 14 nicklas 1490       else
2611 29 Aug 14 nicklas 1491       {
2611 29 Aug 14 nicklas 1492         data = '-';
2611 29 Aug 14 nicklas 1493         sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1494       }
2611 29 Aug 14 nicklas 1495       data = getJSONData(sitesCombined, 'missingLaterality');
2611 29 Aug 14 nicklas 1496       sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1497       data = getJSONData(sitesCombined, 'missingSamplingDateTime');
2611 29 Aug 14 nicklas 1498       sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1499       data = getJSONData(sitesCombined, 'missingRnaLaterDateTime');
2611 29 Aug 14 nicklas 1500       sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1501     }
2611 29 Aug 14 nicklas 1502     else if (sampleType == 'nospecimen')
2611 29 Aug 14 nicklas 1503     {
2611 29 Aug 14 nicklas 1504       if (!permissionDeniedForPad)
2611 29 Aug 14 nicklas 1505       {
2611 29 Aug 14 nicklas 1506         data = getJSONData(sitesCombined, 'missingPadReference');
2611 29 Aug 14 nicklas 1507         sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1508       }
2611 29 Aug 14 nicklas 1509       else
2611 29 Aug 14 nicklas 1510       {
2611 29 Aug 14 nicklas 1511         data = '-';
2611 29 Aug 14 nicklas 1512         sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1513       }
2611 29 Aug 14 nicklas 1514       data = getJSONData(sitesCombined, 'missingLaterality');
2611 29 Aug 14 nicklas 1515       sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1516       data = getJSONData(sitesCombined, 'missingSamplingDateTime');
2611 29 Aug 14 nicklas 1517       sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1518     }
2611 29 Aug 14 nicklas 1519     else if (sampleType == 'blood')
2611 29 Aug 14 nicklas 1520     {
2611 29 Aug 14 nicklas 1521       data = getJSONData(sitesCombined, 'missingBloodSamplingDateTime');
2611 29 Aug 14 nicklas 1522       sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1523       data = getJSONData(sitesCombined, 'missingBloodFreezerDateTime');
2611 29 Aug 14 nicklas 1524       sitesCombinedRow.appendChild(getTableCellElement(data, 'colsummary'));
2611 29 Aug 14 nicklas 1525     }
2611 29 Aug 14 nicklas 1526   }
2611 29 Aug 14 nicklas 1527   reportTable.appendChild(sitesCombinedRow);  
2611 29 Aug 14 nicklas 1528
2611 29 Aug 14 nicklas 1529   return reportTable;
2611 29 Aug 14 nicklas 1530 }
2611 29 Aug 14 nicklas 1531
2611 29 Aug 14 nicklas 1532 function createConsentTablePatientsWithMultipleDates(report)
2611 29 Aug 14 nicklas 1533 {
2611 29 Aug 14 nicklas 1534   var multipleDatesTable = getReportTable();
2611 29 Aug 14 nicklas 1535   var headerRow = document.createElement('tr');    
2611 29 Aug 14 nicklas 1536   var columnHeaderRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1537   
2611 29 Aug 14 nicklas 1538   // Table header
2611 29 Aug 14 nicklas 1539   var numCols = 3;
2611 29 Aug 14 nicklas 1540   var headerText = 'Consent forms with multiple dates for same patient';
2611 29 Aug 14 nicklas 1541   headerRow.appendChild(getTableCellElement(headerText, 'reportheader', numCols));
2611 29 Aug 14 nicklas 1542   
2611 29 Aug 14 nicklas 1543   // Columnsheader
2611 29 Aug 14 nicklas 1544   columnHeaderRow.appendChild(getTableCellElement('Patient ID', 'reportsubheader'));
2611 29 Aug 14 nicklas 1545   columnHeaderRow.appendChild(getTableCellElement('Date 1', 'reportsubheader'));
2611 29 Aug 14 nicklas 1546   columnHeaderRow.appendChild(getTableCellElement('Date 2', 'reportsubheader'));
2611 29 Aug 14 nicklas 1547
2611 29 Aug 14 nicklas 1548   // Build table      
2611 29 Aug 14 nicklas 1549   multipleDatesTable.appendChild(headerRow);
2611 29 Aug 14 nicklas 1550   multipleDatesTable.appendChild(columnHeaderRow);
2611 29 Aug 14 nicklas 1551         
2611 29 Aug 14 nicklas 1552   // Data rows
2611 29 Aug 14 nicklas 1553   if (report != null)
2611 29 Aug 14 nicklas 1554   {
2611 29 Aug 14 nicklas 1555     var statistics = report.statistics;
2611 29 Aug 14 nicklas 1556     var sessionId = statistics.sessionIdKey;
2611 29 Aug 14 nicklas 1557     var patientsWithMultipleDates = statistics.patientsWithMultipleDatesKey;
2611 29 Aug 14 nicklas 1558     var patientnamePatientid = statistics.patientnamePatientidKey;
2611 29 Aug 14 nicklas 1559     for (var patientName in patientsWithMultipleDates)
2611 29 Aug 14 nicklas 1560     {
2611 29 Aug 14 nicklas 1561       var tableRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1562       // Add patient name to table
2611 29 Aug 14 nicklas 1563       var patientIdStr = patientnamePatientid[patientName];
2615 01 Sep 14 nicklas 1564       var patientLink = createLink(patientName, patientIdStr, 'BIOSOURCE', 'View this sample');
2615 01 Sep 14 nicklas 1565       var tableCol = createTableCellElementChild(patientLink, 'reportdata');
2611 29 Aug 14 nicklas 1566       tableRow.appendChild(tableCol);
2611 29 Aug 14 nicklas 1567       // Add dates to table in chronological order
2611 29 Aug 14 nicklas 1568       var dateSet = patientsWithMultipleDates[patientName];
2611 29 Aug 14 nicklas 1569       var dateStr1 = '';
2611 29 Aug 14 nicklas 1570       var dateStr2 = '';
2611 29 Aug 14 nicklas 1571       for (var key in dateSet)
2611 29 Aug 14 nicklas 1572       {
2611 29 Aug 14 nicklas 1573         var dateStr = dateSet[key];
2611 29 Aug 14 nicklas 1574         if (dateStr1 == '')
2611 29 Aug 14 nicklas 1575         {
2611 29 Aug 14 nicklas 1576           dateStr1 = dateStr;
2611 29 Aug 14 nicklas 1577         }
2611 29 Aug 14 nicklas 1578         else if (dateStr > dateStr1)
2611 29 Aug 14 nicklas 1579         {
2611 29 Aug 14 nicklas 1580           dateStr2 = dateStr;
2611 29 Aug 14 nicklas 1581         }
2611 29 Aug 14 nicklas 1582         else
2611 29 Aug 14 nicklas 1583         {
2611 29 Aug 14 nicklas 1584           dateStr2 = dateStr1;
2611 29 Aug 14 nicklas 1585           dateStr1 = dateStr;
2611 29 Aug 14 nicklas 1586         }
2611 29 Aug 14 nicklas 1587       }
2611 29 Aug 14 nicklas 1588       var dateCol = '';
2611 29 Aug 14 nicklas 1589       dateCol = getTableCellElement(dateStr1, 'reportdata');
2611 29 Aug 14 nicklas 1590       tableRow.appendChild(dateCol);
2611 29 Aug 14 nicklas 1591       dateCol = getTableCellElement(dateStr2, 'reportdata');
2611 29 Aug 14 nicklas 1592       tableRow.appendChild(dateCol);
2611 29 Aug 14 nicklas 1593       multipleDatesTable.appendChild(tableRow);
2611 29 Aug 14 nicklas 1594     }
2611 29 Aug 14 nicklas 1595   }
2611 29 Aug 14 nicklas 1596
2611 29 Aug 14 nicklas 1597   return multipleDatesTable;
2611 29 Aug 14 nicklas 1598 }
2611 29 Aug 14 nicklas 1599
2611 29 Aug 14 nicklas 1600 function addDataRowsToConsentTable(report, reportTable, numDecimals)
2611 29 Aug 14 nicklas 1601 {
2611 29 Aug 14 nicklas 1602   var sites = report.sites;    
2611 29 Aug 14 nicklas 1603   var statistics = report.statistics;
2611 29 Aug 14 nicklas 1604   unknownCreation = statistics.noDate;
2611 29 Aug 14 nicklas 1605   unknownSite = statistics.unknownSite;
2611 29 Aug 14 nicklas 1606   for (var siteNo = 0; siteNo < sites.length; siteNo++)
2611 29 Aug 14 nicklas 1607   {
2611 29 Aug 14 nicklas 1608     var site = sites[siteNo];
2611 29 Aug 14 nicklas 1609     var siteName = site.name;
2611 29 Aug 14 nicklas 1610     var siteStartDate = dateStrToDate(site.startDate);
2611 29 Aug 14 nicklas 1611     var siteStartDateStr = addHyphensToDateString(site.startDate);
2611 29 Aug 14 nicklas 1612     
2611 29 Aug 14 nicklas 1613     var siteData = statistics[site.prefix];      
2611 29 Aug 14 nicklas 1614     var siteLatestDate = siteData['latestDateKey'];
2611 29 Aug 14 nicklas 1615     var siteLatestDateStr = addHyphensToDateString(siteLatestDate);
2611 29 Aug 14 nicklas 1616     var tableRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1617     var tableCol = getTableCellElement(siteName, 'rowtitle');
2611 29 Aug 14 nicklas 1618     tableRow.appendChild(tableCol);
2611 29 Aug 14 nicklas 1619     tableRow.appendChild(getTableCellElement(siteStartDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1620     tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1621     var noDateKey = 'noDate';
2611 29 Aug 14 nicklas 1622     var sumDateIgnoredKey = 'sumDateIgnoredKey';
2611 29 Aug 14 nicklas 1623     var totalKey = 'totalKey';
2611 29 Aug 14 nicklas 1624     if (siteData != null)
2611 29 Aug 14 nicklas 1625     {
2611 29 Aug 14 nicklas 1626       data = getJSONDataWithPercent(siteData, 'yes', sumDateIgnoredKey, numDecimals);
2611 29 Aug 14 nicklas 1627       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1628       data = getJSONDataWithPercent(siteData, 'no', sumDateIgnoredKey, numDecimals);
2611 29 Aug 14 nicklas 1629       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1630       data = getJSONDataWithPercent(siteData, 'notAsked', sumDateIgnoredKey, numDecimals);
2611 29 Aug 14 nicklas 1631       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1632       // Add column with summed values for site
2611 29 Aug 14 nicklas 1633       var siteSum = getJSONData(siteData, sumDateIgnoredKey, 0);
2611 29 Aug 14 nicklas 1634       tableRow.appendChild(getTableCellElement(siteSum, 'rowsummary'));
2611 29 Aug 14 nicklas 1635     }
2611 29 Aug 14 nicklas 1636     // Add column with total number of samples for site, regardless of creation date
2611 29 Aug 14 nicklas 1637     var siteTotal = getJSONData(siteData, totalKey, 0);
2611 29 Aug 14 nicklas 1638     tableRow.appendChild(getTableCellElement(siteTotal, 'rowsummary'));
2611 29 Aug 14 nicklas 1639     reportTable.appendChild(tableRow);
2611 29 Aug 14 nicklas 1640   }
2611 29 Aug 14 nicklas 1641 }
2611 29 Aug 14 nicklas 1642
2611 29 Aug 14 nicklas 1643 function addDataRowsToConsentTableHasDate(report, reportTable, numDecimals)
2611 29 Aug 14 nicklas 1644 {
2611 29 Aug 14 nicklas 1645   var sites = report.sites;    
2611 29 Aug 14 nicklas 1646   var statistics = report.statistics;
2611 29 Aug 14 nicklas 1647   unknownCreation = statistics.noDate;
2611 29 Aug 14 nicklas 1648   unknownSite = statistics.unknownSite;
2611 29 Aug 14 nicklas 1649   for (var siteNo = 0; siteNo < sites.length; siteNo++)
2611 29 Aug 14 nicklas 1650   {
2611 29 Aug 14 nicklas 1651     var site = sites[siteNo];
2611 29 Aug 14 nicklas 1652     var siteName = site.name;
2611 29 Aug 14 nicklas 1653     var siteStartDate = dateStrToDate(site.startDate);
2611 29 Aug 14 nicklas 1654     var siteStartDateStr = addHyphensToDateString(site.startDate);
2611 29 Aug 14 nicklas 1655     
2611 29 Aug 14 nicklas 1656     var siteData = statistics[site.prefix];      
2611 29 Aug 14 nicklas 1657     var siteLatestDate = siteData['latestDateKey'];
2611 29 Aug 14 nicklas 1658     var siteLatestDateStr = addHyphensToDateString(siteLatestDate);
2611 29 Aug 14 nicklas 1659     var tableRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1660     var tableCol = getTableCellElement(siteName, 'rowtitle');
2611 29 Aug 14 nicklas 1661     tableRow.appendChild(tableCol);
2611 29 Aug 14 nicklas 1662     tableRow.appendChild(getTableCellElement(siteStartDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1663     tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1664     var noDateKey = 'noDate';
2611 29 Aug 14 nicklas 1665     var sumKey = 'sumKey';
2611 29 Aug 14 nicklas 1666     var totalKey = 'totalKey';
2611 29 Aug 14 nicklas 1667     if (siteData != null)
2611 29 Aug 14 nicklas 1668     {
2611 29 Aug 14 nicklas 1669       data = getJSONDataWithPercent(siteData, 'yesPatientExistsDateExists', sumKey, numDecimals);
2611 29 Aug 14 nicklas 1670       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1671       data = getJSONDataWithPercent(siteData, 'yesPatientUnknownDateExists', sumKey, numDecimals);
2611 29 Aug 14 nicklas 1672       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1673       data = getJSONDataWithPercent(siteData, 'noDateExists', sumKey, numDecimals);
2611 29 Aug 14 nicklas 1674       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1675       data = getJSONDataWithPercent(siteData, 'notAskedDateExists', sumKey, numDecimals);
2611 29 Aug 14 nicklas 1676       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1677       data = getJSONDataWithPercent(siteData, noDateKey, sumKey, numDecimals);
2611 29 Aug 14 nicklas 1678       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1679       // Add column with summed values for site
2611 29 Aug 14 nicklas 1680       var siteSum = getJSONData(siteData, sumKey, 0);
2611 29 Aug 14 nicklas 1681       tableRow.appendChild(getTableCellElement(siteSum, 'rowsummary'));
2611 29 Aug 14 nicklas 1682     }
2611 29 Aug 14 nicklas 1683     // Add column with total number of samples for site, regardless of creation date
2611 29 Aug 14 nicklas 1684     var siteTotal = getJSONData(siteData, totalKey, 0);
2611 29 Aug 14 nicklas 1685     tableRow.appendChild(getTableCellElement(siteTotal, 'rowsummary'));
2611 29 Aug 14 nicklas 1686     reportTable.appendChild(tableRow);
2611 29 Aug 14 nicklas 1687   }
2611 29 Aug 14 nicklas 1688 }
2611 29 Aug 14 nicklas 1689
2611 29 Aug 14 nicklas 1690 function addDataRowsToConsentTableUnknownDate(report, reportTable, numDecimals)
2611 29 Aug 14 nicklas 1691 {
2611 29 Aug 14 nicklas 1692   var sites = report.sites;    
2611 29 Aug 14 nicklas 1693   var statistics = report.statistics;
2611 29 Aug 14 nicklas 1694   unknownCreation = statistics.noDate;
2611 29 Aug 14 nicklas 1695   unknownSite = statistics.unknownSite;
2611 29 Aug 14 nicklas 1696   numMissing = statistics.missing;
2611 29 Aug 14 nicklas 1697   for (var siteNo = 0; siteNo < sites.length; siteNo++)
2611 29 Aug 14 nicklas 1698   {
2611 29 Aug 14 nicklas 1699     var site = sites[siteNo];
2611 29 Aug 14 nicklas 1700     var siteName = site.name;
2611 29 Aug 14 nicklas 1701     var siteStartDate = dateStrToDate(site.startDate);
2611 29 Aug 14 nicklas 1702     var siteStartDateStr = addHyphensToDateString(site.startDate);
2611 29 Aug 14 nicklas 1703     
2611 29 Aug 14 nicklas 1704     var siteData = statistics[site.prefix];      
2611 29 Aug 14 nicklas 1705     var siteLatestDate = siteData['latestDateKey'];
2611 29 Aug 14 nicklas 1706     var siteLatestDateStr = addHyphensToDateString(siteLatestDate);
2611 29 Aug 14 nicklas 1707     var tableRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1708     var tableCol = getTableCellElement(siteName, 'rowtitle');
2611 29 Aug 14 nicklas 1709     tableRow.appendChild(tableCol);
2611 29 Aug 14 nicklas 1710     tableRow.appendChild(getTableCellElement(siteStartDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1711     tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1712     var noDateOrMissingKey = 'noDateOrMissing';
2611 29 Aug 14 nicklas 1713     var sumKey = 'sumKey';
2611 29 Aug 14 nicklas 1714     var totalKey = 'totalKey';
2611 29 Aug 14 nicklas 1715     if (siteData != null)
2611 29 Aug 14 nicklas 1716     {
2611 29 Aug 14 nicklas 1717       data = getJSONDataWithPercent(siteData, 'yesDateUnknown', noDateOrMissingKey, numDecimals);
2611 29 Aug 14 nicklas 1718       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1719       data = getJSONDataWithPercent(siteData, 'noDateUnknown', noDateOrMissingKey, numDecimals);
2611 29 Aug 14 nicklas 1720       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1721       data = getJSONDataWithPercent(siteData, 'notAskedDateUnknown', noDateOrMissingKey, numDecimals);
2611 29 Aug 14 nicklas 1722       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1723       data = getJSONDataWithPercent(siteData, 'missing', noDateOrMissingKey, numDecimals);
2611 29 Aug 14 nicklas 1724       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1725       // Add column with summed values for site
2611 29 Aug 14 nicklas 1726       var siteSum = getJSONData(siteData, noDateOrMissingKey, 0);
2611 29 Aug 14 nicklas 1727       tableRow.appendChild(getTableCellElement(siteSum, 'rowsummary'));
2611 29 Aug 14 nicklas 1728     }
2611 29 Aug 14 nicklas 1729     // Add column with total number of samples for site, regardless of creation date
2611 29 Aug 14 nicklas 1730     var siteTotal = getJSONData(siteData, totalKey, 0);
2611 29 Aug 14 nicklas 1731     tableRow.appendChild(getTableCellElement(siteTotal, 'rowsummary'));
2611 29 Aug 14 nicklas 1732     reportTable.appendChild(tableRow);
2611 29 Aug 14 nicklas 1733   }
2611 29 Aug 14 nicklas 1734 }
2611 29 Aug 14 nicklas 1735
2611 29 Aug 14 nicklas 1736 function addDataRowsToOverviewTable(report, reportTable)
2611 29 Aug 14 nicklas 1737 {
2611 29 Aug 14 nicklas 1738   var sites = report.sites;    
2611 29 Aug 14 nicklas 1739   var statistics = report.statistics;
2611 29 Aug 14 nicklas 1740   unknownCreation = statistics.noDate;
2611 29 Aug 14 nicklas 1741   unknownSite = statistics.unknownSite;
2611 29 Aug 14 nicklas 1742   for (var siteNo = 0; siteNo < sites.length; siteNo++)
2611 29 Aug 14 nicklas 1743   {
2611 29 Aug 14 nicklas 1744     var site = sites[siteNo];
2611 29 Aug 14 nicklas 1745     var siteName = site.name;        
2611 29 Aug 14 nicklas 1746     var siteStartDate = dateStrToDate(site.startDate);
2611 29 Aug 14 nicklas 1747     var siteStartDateStr = addHyphensToDateString(site.startDate);
2611 29 Aug 14 nicklas 1748     
2801 13 Oct 14 nicklas 1749     var siteData = statistics[site.prefix];      
2611 29 Aug 14 nicklas 1750     var siteLatestDate = siteData['latestDateKey'];
2611 29 Aug 14 nicklas 1751     var siteLatestDateStr = addHyphensToDateString(siteLatestDate);
2611 29 Aug 14 nicklas 1752     var tableRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1753     var tableCol = getTableCellElement(siteName, 'rowtitle');
2611 29 Aug 14 nicklas 1754     tableRow.appendChild(tableCol);
2611 29 Aug 14 nicklas 1755     tableRow.appendChild(getTableCellElement(siteStartDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1756     tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1757     var noDateKey = 'noDate';
2611 29 Aug 14 nicklas 1758     var sumKey = 'sumKey';
2611 29 Aug 14 nicklas 1759     var totalKey = 'totalKey';
2611 29 Aug 14 nicklas 1760     if (siteData != null)
2611 29 Aug 14 nicklas 1761     {
2611 29 Aug 14 nicklas 1762       data = getJSONData(siteData, 'patient');
2611 29 Aug 14 nicklas 1763       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1764       data = getJSONData(siteData, 'bloodSample');
2611 29 Aug 14 nicklas 1765       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1766       data = getJSONData(siteData, 'bloodSampleFollowUp');
2611 29 Aug 14 nicklas 1767       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1768       data = getJSONData(siteData, 'specimen');
2611 29 Aug 14 nicklas 1769       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1770       data = getJSONData(siteData, 'noSpecimen');
2611 29 Aug 14 nicklas 1771       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1772       data = getJSONData(siteData, 'consentYes');
2611 29 Aug 14 nicklas 1773       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1774       data = getJSONData(siteData, 'consentMissing');
2611 29 Aug 14 nicklas 1775       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1776     }
2611 29 Aug 14 nicklas 1777     reportTable.appendChild(tableRow);
2611 29 Aug 14 nicklas 1778   }
2611 29 Aug 14 nicklas 1779 }
2611 29 Aug 14 nicklas 1780
2611 29 Aug 14 nicklas 1781 function addDataRowsToOverviewPatientWithSampleTable(report, reportTable)
2611 29 Aug 14 nicklas 1782 {
2611 29 Aug 14 nicklas 1783   var sites = report.sites;    
2611 29 Aug 14 nicklas 1784   var statistics = report.statistics;
2611 29 Aug 14 nicklas 1785   unknownCreation = statistics.noDate;
2611 29 Aug 14 nicklas 1786   unknownSite = statistics.unknownSite;
2611 29 Aug 14 nicklas 1787   for (var siteNo = 0; siteNo < sites.length; siteNo++)
2611 29 Aug 14 nicklas 1788   {        
2611 29 Aug 14 nicklas 1789     var site = sites[siteNo];
2611 29 Aug 14 nicklas 1790     var siteName = site.name;        
2611 29 Aug 14 nicklas 1791     var siteStartDate = dateStrToDate(site.startDate);
2611 29 Aug 14 nicklas 1792     var siteStartDateStr = addHyphensToDateString(site.startDate);
2611 29 Aug 14 nicklas 1793     
2611 29 Aug 14 nicklas 1794     var siteData = statistics[site.prefix];      
2611 29 Aug 14 nicklas 1795     var siteLatestDate = siteData['latestDateKey'];
2611 29 Aug 14 nicklas 1796     var siteLatestDateStr = addHyphensToDateString(siteLatestDate);
2611 29 Aug 14 nicklas 1797     var tableRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1798     var tableCol = getTableCellElement(siteName, 'rowtitle');
2611 29 Aug 14 nicklas 1799     tableRow.appendChild(tableCol);
2611 29 Aug 14 nicklas 1800     tableRow.appendChild(getTableCellElement(siteStartDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1801     tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1802     var noDateKey = 'noDate';
2611 29 Aug 14 nicklas 1803     var sumKey = 'sumKey';
2611 29 Aug 14 nicklas 1804     var totalKey = 'totalKey';
2611 29 Aug 14 nicklas 1805     if (siteData != null)
2611 29 Aug 14 nicklas 1806     {
2611 29 Aug 14 nicklas 1807       data = getJSONData(siteData, 'patient');
2611 29 Aug 14 nicklas 1808       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1809       data = getJSONData(siteData, 'patientWithBloodSample');
2611 29 Aug 14 nicklas 1810       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1811       data = getJSONData(siteData, 'patientWithFollowUpBloodSample');
2611 29 Aug 14 nicklas 1812       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1813       data = getJSONData(siteData, 'patientWithSpecimen');
2611 29 Aug 14 nicklas 1814       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1815       data = getJSONData(siteData, 'patientWithNoSpecimen');
2611 29 Aug 14 nicklas 1816       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1817     }
2611 29 Aug 14 nicklas 1818     reportTable.appendChild(tableRow);
2611 29 Aug 14 nicklas 1819   }
2611 29 Aug 14 nicklas 1820 }
2611 29 Aug 14 nicklas 1821
2611 29 Aug 14 nicklas 1822 function addDataRowsToOverviewPatientDetailedTable(report, reportTable)
2611 29 Aug 14 nicklas 1823 {
2611 29 Aug 14 nicklas 1824   var sites = report.sites;    
2611 29 Aug 14 nicklas 1825   var statistics = report.statistics;
2611 29 Aug 14 nicklas 1826   unknownCreation = statistics.noDate;
2611 29 Aug 14 nicklas 1827   unknownSite = statistics.unknownSite;
2611 29 Aug 14 nicklas 1828   for (var siteNo = 0; siteNo < sites.length; siteNo++)
2611 29 Aug 14 nicklas 1829   {    
2611 29 Aug 14 nicklas 1830     var site = sites[siteNo];
2611 29 Aug 14 nicklas 1831     var siteName = site.name;        
2611 29 Aug 14 nicklas 1832     var siteStartDate = dateStrToDate(site.startDate);
2611 29 Aug 14 nicklas 1833     var siteStartDateStr = addHyphensToDateString(site.startDate);
2611 29 Aug 14 nicklas 1834     
2611 29 Aug 14 nicklas 1835     var siteData = statistics[site.prefix];
2611 29 Aug 14 nicklas 1836 /*    
2611 29 Aug 14 nicklas 1837     var siteLatestDate = siteData['latestDateKey'];
2611 29 Aug 14 nicklas 1838     var siteLatestDateStr = addHyphensToDateString(siteLatestDate);
2611 29 Aug 14 nicklas 1839 */
2611 29 Aug 14 nicklas 1840     var tableRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1841     var tableCol = getTableCellElement(siteName, 'rowtitle');
2611 29 Aug 14 nicklas 1842     tableRow.appendChild(tableCol);
2611 29 Aug 14 nicklas 1843     tableRow.appendChild(getTableCellElement(siteStartDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1844 /*
2611 29 Aug 14 nicklas 1845     tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1846 */
2611 29 Aug 14 nicklas 1847     var noDateKey = 'noDate';
2611 29 Aug 14 nicklas 1848     var sumKey = 'sumKey';
2611 29 Aug 14 nicklas 1849     var totalKey = 'totalKey';
2611 29 Aug 14 nicklas 1850     if (siteData != null)
2611 29 Aug 14 nicklas 1851     {
2611 29 Aug 14 nicklas 1852       data = getJSONData(siteData, 'patientBloodSampleOnly');
2611 29 Aug 14 nicklas 1853       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1854       data = getJSONData(siteData, 'patientSpecimenOnly');
2611 29 Aug 14 nicklas 1855       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1856       data = getJSONData(siteData, 'patientNoSpecimenOnly');
2611 29 Aug 14 nicklas 1857       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1858       data = getJSONData(siteData, 'patientBloodSampleAndSpecimen');
2611 29 Aug 14 nicklas 1859       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1860       data = getJSONData(siteData, 'patientBloodSampleAndNoSpecimen');
2611 29 Aug 14 nicklas 1861       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1862       data = getJSONData(siteData, 'patientSpecimenAndNoSpecimen');
2611 29 Aug 14 nicklas 1863       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1864       data = getJSONData(siteData, 'patientBloodSampleAndSpecimenAndNoSpecimen');
2611 29 Aug 14 nicklas 1865       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1866       //data = getJSONData(siteData, 'patientNoSamples');
2611 29 Aug 14 nicklas 1867       //tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1868       data = getJSONData(siteData, 'sumKey');
2611 29 Aug 14 nicklas 1869       tableRow.appendChild(getTableCellElement(data, 'rowsummary'));
2611 29 Aug 14 nicklas 1870     }
2611 29 Aug 14 nicklas 1871     reportTable.appendChild(tableRow);
2611 29 Aug 14 nicklas 1872   }
2611 29 Aug 14 nicklas 1873 }
2611 29 Aug 14 nicklas 1874
2611 29 Aug 14 nicklas 1875 function addDataRowsToMissingSampleDataTable(report, reportTable)
2611 29 Aug 14 nicklas 1876 {
2611 29 Aug 14 nicklas 1877   var sites = report.sites;    
2611 29 Aug 14 nicklas 1878   var statistics = report.statistics;
2611 29 Aug 14 nicklas 1879   var sampleType = report.sampleType;
2611 29 Aug 14 nicklas 1880   var permissionDeniedForPatientName = report.permissionDeniedForPatientName;
2611 29 Aug 14 nicklas 1881   var permissionDeniedForPad = report.permissionDeniedForPad;
2611 29 Aug 14 nicklas 1882   var unknownCreation = statistics.noDate;
2611 29 Aug 14 nicklas 1883   var unknownSite = statistics.unknownSite;
2611 29 Aug 14 nicklas 1884   for (var siteNo = 0; siteNo < sites.length; siteNo++)
2611 29 Aug 14 nicklas 1885   {      
2611 29 Aug 14 nicklas 1886     var site = sites[siteNo];
2611 29 Aug 14 nicklas 1887     var siteName = site.name;
2611 29 Aug 14 nicklas 1888     var siteStartDate = dateStrToDate(site.startDate);
2611 29 Aug 14 nicklas 1889     var siteStartDateStr = addHyphensToDateString(site.startDate);
2611 29 Aug 14 nicklas 1890     
2611 29 Aug 14 nicklas 1891     var siteData = statistics[site.prefix];      
2611 29 Aug 14 nicklas 1892     var siteLatestDate = siteData['latestDateKey'];
2611 29 Aug 14 nicklas 1893     var siteLatestDateStr = addHyphensToDateString(siteLatestDate);
2611 29 Aug 14 nicklas 1894     var tableRow = document.createElement('tr');
2611 29 Aug 14 nicklas 1895     var tableCol = getTableCellElement(siteName, 'rowtitle');
2611 29 Aug 14 nicklas 1896     tableRow.appendChild(tableCol);
2611 29 Aug 14 nicklas 1897     tableRow.appendChild(getTableCellElement(siteStartDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1898     tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 1899     //var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());      
2611 29 Aug 14 nicklas 1900     var noDateKey = 'noDate';
2611 29 Aug 14 nicklas 1901     var sumKey = 'sumKey';
2611 29 Aug 14 nicklas 1902     var totalKey = 'totalKey';
2611 29 Aug 14 nicklas 1903     if (siteData != null)
2611 29 Aug 14 nicklas 1904     {
2611 29 Aug 14 nicklas 1905       if (!permissionDeniedForPatientName)
2611 29 Aug 14 nicklas 1906       {
2611 29 Aug 14 nicklas 1907         data = getJSONData(siteData, 'missingPatientName');
2611 29 Aug 14 nicklas 1908         tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1909       }
2611 29 Aug 14 nicklas 1910       else
2611 29 Aug 14 nicklas 1911       {
2611 29 Aug 14 nicklas 1912         data = '-';
2611 29 Aug 14 nicklas 1913         tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1914       }
2611 29 Aug 14 nicklas 1915       if (sampleType == 'specimen')
2611 29 Aug 14 nicklas 1916       {
2611 29 Aug 14 nicklas 1917         if (!permissionDeniedForPad)
2611 29 Aug 14 nicklas 1918         {
2611 29 Aug 14 nicklas 1919           data = getJSONData(siteData, 'missingPadReference');
2611 29 Aug 14 nicklas 1920           tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1921         }
2611 29 Aug 14 nicklas 1922         else
2611 29 Aug 14 nicklas 1923         {
2611 29 Aug 14 nicklas 1924           data = '-';
2611 29 Aug 14 nicklas 1925           tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1926         }
2611 29 Aug 14 nicklas 1927         
2611 29 Aug 14 nicklas 1928         data = getJSONData(siteData, 'missingLaterality');
2611 29 Aug 14 nicklas 1929         tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1930         data = getJSONData(siteData, 'missingSamplingDateTime');
2611 29 Aug 14 nicklas 1931         tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1932         data = getJSONData(siteData, 'missingRnaLaterDateTime');
2611 29 Aug 14 nicklas 1933         tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1934       }
2611 29 Aug 14 nicklas 1935       else if (sampleType == 'nospecimen')
2611 29 Aug 14 nicklas 1936       {
2611 29 Aug 14 nicklas 1937         if (!permissionDeniedForPad)
2611 29 Aug 14 nicklas 1938         {
2611 29 Aug 14 nicklas 1939           data = getJSONData(siteData, 'missingPadReference');
2611 29 Aug 14 nicklas 1940           tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1941         }
2611 29 Aug 14 nicklas 1942         else
2611 29 Aug 14 nicklas 1943         {
2611 29 Aug 14 nicklas 1944           data = '-';
2611 29 Aug 14 nicklas 1945           tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1946         }          
2611 29 Aug 14 nicklas 1947         data = getJSONData(siteData, 'missingLaterality');
2611 29 Aug 14 nicklas 1948         tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1949         data = getJSONData(siteData, 'missingSamplingDateTime');
2611 29 Aug 14 nicklas 1950         tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1951       }
2611 29 Aug 14 nicklas 1952       else if (sampleType == 'blood')
2611 29 Aug 14 nicklas 1953       {
2611 29 Aug 14 nicklas 1954         data = getJSONData(siteData, 'missingBloodSamplingDateTime');
2611 29 Aug 14 nicklas 1955         tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1956         data = getJSONData(siteData, 'missingBloodFreezerDateTime');
2611 29 Aug 14 nicklas 1957         tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 1958       }
2611 29 Aug 14 nicklas 1959     }
2611 29 Aug 14 nicklas 1960     reportTable.appendChild(tableRow);
2611 29 Aug 14 nicklas 1961   }
2611 29 Aug 14 nicklas 1962 }
2611 29 Aug 14 nicklas 1963
2615 01 Sep 14 nicklas 1964 function createLink(name, id, itemType, title)
2611 29 Aug 14 nicklas 1965 {
2615 01 Sep 14 nicklas 1966   var link = document.createElement('span');
2615 01 Sep 14 nicklas 1967   link.className = 'link';
2615 01 Sep 14 nicklas 1968   link.title = title;
2615 01 Sep 14 nicklas 1969   link.innerHTML = name;
2615 01 Sep 14 nicklas 1970   Events.addEventHandler(link, 'click', Items.itemOnClick, {'item-id': id, 'item-type': itemType, 'no-edit': 1});
2615 01 Sep 14 nicklas 1971   return link;
2611 29 Aug 14 nicklas 1972 }
2611 29 Aug 14 nicklas 1973
2615 01 Sep 14 nicklas 1974 function createTableCellElementChild(child, clazz, colspan, rowspan)
2611 29 Aug 14 nicklas 1975 {
2611 29 Aug 14 nicklas 1976   var cellElement = document.createElement('td');
2611 29 Aug 14 nicklas 1977   cellElement.setAttribute('class', clazz);
2611 29 Aug 14 nicklas 1978   if (colspan != null) cellElement.setAttribute('colspan', colspan);
2611 29 Aug 14 nicklas 1979   if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
2615 01 Sep 14 nicklas 1980   cellElement.appendChild(child);
2611 29 Aug 14 nicklas 1981   
2611 29 Aug 14 nicklas 1982   return cellElement;
2611 29 Aug 14 nicklas 1983 }
2611 29 Aug 14 nicklas 1984
2611 29 Aug 14 nicklas 1985 function getJSONDataWithPercent(jsonObject, key, sumKey, numDecimals)
2611 29 Aug 14 nicklas 1986 {
2611 29 Aug 14 nicklas 1987   var dataNum = getJSONData(jsonObject, key);
2611 29 Aug 14 nicklas 1988   var dataSum = getJSONData(jsonObject, sumKey);
2611 29 Aug 14 nicklas 1989   var dataPct = '0';
2611 29 Aug 14 nicklas 1990   if (dataSum != null && dataSum != 0)
2611 29 Aug 14 nicklas 1991   {
2611 29 Aug 14 nicklas 1992     dataPct = 100*dataNum/dataSum;
2611 29 Aug 14 nicklas 1993     dataPct = dataPct.toFixed(numDecimals);
2611 29 Aug 14 nicklas 1994   }
2611 29 Aug 14 nicklas 1995   var data = dataNum + ' (' + dataPct + '%)';
2611 29 Aug 14 nicklas 1996   return data;
2611 29 Aug 14 nicklas 1997 }
2611 29 Aug 14 nicklas 1998
2611 29 Aug 14 nicklas 1999 function getJSONData(jsonObject, key)
2611 29 Aug 14 nicklas 2000 {
2611 29 Aug 14 nicklas 2001   var data = getJSONData(jsonObject, key, '');
2611 29 Aug 14 nicklas 2002   return data;
2611 29 Aug 14 nicklas 2003 }
2611 29 Aug 14 nicklas 2004
2611 29 Aug 14 nicklas 2005 function getJSONData(jsonObject, key, defaultChoice)
2611 29 Aug 14 nicklas 2006 {
2611 29 Aug 14 nicklas 2007   var data = defaultChoice;
2611 29 Aug 14 nicklas 2008   if (jsonObject != null)
2611 29 Aug 14 nicklas 2009   {
2611 29 Aug 14 nicklas 2010     if (jsonObject[key] != null)
2611 29 Aug 14 nicklas 2011     {
2611 29 Aug 14 nicklas 2012       data = jsonObject[key];
2611 29 Aug 14 nicklas 2013     }
2611 29 Aug 14 nicklas 2014   }
2611 29 Aug 14 nicklas 2015   /*
2611 29 Aug 14 nicklas 2016   else
2611 29 Aug 14 nicklas 2017   {
2611 29 Aug 14 nicklas 2018     data = 'jsonObject==null';
2611 29 Aug 14 nicklas 2019   }
2611 29 Aug 14 nicklas 2020   */
2611 29 Aug 14 nicklas 2021   return data;
2611 29 Aug 14 nicklas 2022 }
2611 29 Aug 14 nicklas 2023
2611 29 Aug 14 nicklas 2024 function addQuarterColumnHeaders(columnHeaderRow, startDate)
2611 29 Aug 14 nicklas 2025 {
2611 29 Aug 14 nicklas 2026   var currentDate = startDate;
2611 29 Aug 14 nicklas 2027   for (var i=0;i<numCols;i++)
2611 29 Aug 14 nicklas 2028   {
2611 29 Aug 14 nicklas 2029     var quarter = Math.floor(currentDate.getMonth()/3)+1;
2611 29 Aug 14 nicklas 2030     var columnText = 'Q'+quarter;
2611 29 Aug 14 nicklas 2031     var quarterHeader = getTableCellElement(columnText, 'reportsubheader');
2611 29 Aug 14 nicklas 2032     columnHeaderRow.appendChild(quarterHeader);  
2611 29 Aug 14 nicklas 2033     currentDate.setMonth(currentDate.getMonth()+3);      
2611 29 Aug 14 nicklas 2034   }
2611 29 Aug 14 nicklas 2035 }
2611 29 Aug 14 nicklas 2036
2611 29 Aug 14 nicklas 2037 function addWeekColumnHeaders(columnHeaderRow, startDate)
2611 29 Aug 14 nicklas 2038 {
2611 29 Aug 14 nicklas 2039   var currentDate = startDate;
2611 29 Aug 14 nicklas 2040   var day = currentDate.getDay()-1;
2611 29 Aug 14 nicklas 2041   day = day>=0 ? day: day + 7;
2611 29 Aug 14 nicklas 2042   currentDate.setDate(currentDate.getDate()-day);
2611 29 Aug 14 nicklas 2043   for (var i=0;i<numCols;i++)
2611 29 Aug 14 nicklas 2044   {      
2611 29 Aug 14 nicklas 2045     var weekNum = getISOWeekNumber(currentDate);
2611 29 Aug 14 nicklas 2046     var columnText = weekNum;
2611 29 Aug 14 nicklas 2047     if (weekNum < 10) columnText = '0'+columnText;      
2611 29 Aug 14 nicklas 2048     columnHeaderRow.appendChild(getTableCellElement(columnText, 'reportsubheader'));
2611 29 Aug 14 nicklas 2049     currentDate.setDate(currentDate.getDate()+7);      
2611 29 Aug 14 nicklas 2050   }
2611 29 Aug 14 nicklas 2051 }
2611 29 Aug 14 nicklas 2052
2611 29 Aug 14 nicklas 2053 function addMonthColumnHeaders(columnHeaderRow, startDate)
2611 29 Aug 14 nicklas 2054 {    
2611 29 Aug 14 nicklas 2055   var currentDate = new Date(startDate.getFullYear(), startDate.getMonth());
2611 29 Aug 14 nicklas 2056   for (var i=0;i<numCols;i++)
2611 29 Aug 14 nicklas 2057   {              
2611 29 Aug 14 nicklas 2058     var monthHeader = getTableCellElement(month[currentDate.getMonth()], 'reportsubheader');
2611 29 Aug 14 nicklas 2059     columnHeaderRow.appendChild(monthHeader);        
2611 29 Aug 14 nicklas 2060     currentDate.setMonth(currentDate.getMonth() +1);
2611 29 Aug 14 nicklas 2061   }    
2611 29 Aug 14 nicklas 2062 }
2611 29 Aug 14 nicklas 2063
2611 29 Aug 14 nicklas 2064 function addYearSubHeaders(startDate, endDate, subHeaderRowYear, vt)
2611 29 Aug 14 nicklas 2065 {    
2611 29 Aug 14 nicklas 2066   var currentYear = startDate.getFullYear();  
2611 29 Aug 14 nicklas 2067   
2611 29 Aug 14 nicklas 2068   var columnCounter = 0;    
2611 29 Aug 14 nicklas 2069   do
2611 29 Aug 14 nicklas 2070   {
2611 29 Aug 14 nicklas 2071     var colspan;
2611 29 Aug 14 nicklas 2072     var headerText = currentYear;
2611 29 Aug 14 nicklas 2073     if (vt == "MONTH")
2611 29 Aug 14 nicklas 2074     {
2611 29 Aug 14 nicklas 2075       if (currentYear == startDate.getFullYear())
2611 29 Aug 14 nicklas 2076       {
2611 29 Aug 14 nicklas 2077         colspan =  11-startDate.getMonth()+1;
2611 29 Aug 14 nicklas 2078         if (endDate.getFullYear() == currentYear)
2611 29 Aug 14 nicklas 2079         {
2611 29 Aug 14 nicklas 2080           colspan = colspan - (11-endDate.getMonth());
2611 29 Aug 14 nicklas 2081         }
2611 29 Aug 14 nicklas 2082       }
2611 29 Aug 14 nicklas 2083       else if (currentYear == endDate.getFullYear()) 
2611 29 Aug 14 nicklas 2084         colspan = endDate.getMonth()+1;
2611 29 Aug 14 nicklas 2085       else
2611 29 Aug 14 nicklas 2086         colspan = 12;
2611 29 Aug 14 nicklas 2087     }
2611 29 Aug 14 nicklas 2088     else if (vt == "WEEK")
2611 29 Aug 14 nicklas 2089     {  
2611 29 Aug 14 nicklas 2090       if (startDate.getFullYear() == endDate.getFullYear())
2611 29 Aug 14 nicklas 2091       {
2611 29 Aug 14 nicklas 2092         colspan = numCols;
2611 29 Aug 14 nicklas 2093       }
2611 29 Aug 14 nicklas 2094       else if (currentYear == startDate.getFullYear())
2611 29 Aug 14 nicklas 2095       {
2611 29 Aug 14 nicklas 2096         var startWeek = getISOWeekNumber(startDate);
2611 29 Aug 14 nicklas 2097         var lastDay = new Date(startDate.getFullYear(), 11, 31);
2611 29 Aug 14 nicklas 2098         var endWeek = getISOWeekNumber(lastDay);
2611 29 Aug 14 nicklas 2099         if (endWeek == 1)
2611 29 Aug 14 nicklas 2100         {
2611 29 Aug 14 nicklas 2101           lastDay.setDate(lastDay.getDate()-7);
2611 29 Aug 14 nicklas 2102           endWeek = getISOWeekNumber(lastDay);
2611 29 Aug 14 nicklas 2103         }
2611 29 Aug 14 nicklas 2104         colspan = endWeek - startWeek +1;
2611 29 Aug 14 nicklas 2105       }
2611 29 Aug 14 nicklas 2106       else if (currentYear == endDate.getFullYear())
2611 29 Aug 14 nicklas 2107       {
2611 29 Aug 14 nicklas 2108         var endWeek = getISOWeekNumber(endDate);
2611 29 Aug 14 nicklas 2109         colspan = endWeek;
2611 29 Aug 14 nicklas 2110       }
2611 29 Aug 14 nicklas 2111       else
2611 29 Aug 14 nicklas 2112       {
2611 29 Aug 14 nicklas 2113         var dateInLastWeek = new Date(currentYear, 11, 31);
2611 29 Aug 14 nicklas 2114         var endWeek = getISOWeekNumber(dateInLastWeek);
2611 29 Aug 14 nicklas 2115         if (endWeek == 1)
2611 29 Aug 14 nicklas 2116         {
2611 29 Aug 14 nicklas 2117           dateInLastWeek.setDate(dateInLastWeek.getDate()-7);
2611 29 Aug 14 nicklas 2118           endWeek = getISOWeekNumber(dateInLastWeek);
2611 29 Aug 14 nicklas 2119         }
2611 29 Aug 14 nicklas 2120         colspan = endWeek;
2611 29 Aug 14 nicklas 2121       }                
2611 29 Aug 14 nicklas 2122     }
2611 29 Aug 14 nicklas 2123     else if (vt == "QUARTER")
2611 29 Aug 14 nicklas 2124     {
2611 29 Aug 14 nicklas 2125       if (currentYear == startDate.getFullYear())
2611 29 Aug 14 nicklas 2126       {
2611 29 Aug 14 nicklas 2127         if (startDate.getFullYear() == endDate.getFullYear())
2611 29 Aug 14 nicklas 2128         {
2611 29 Aug 14 nicklas 2129           colspan = Math.floor((endDate.getMonth()-startDate.getMonth())/3)+1;
2611 29 Aug 14 nicklas 2130         }
2611 29 Aug 14 nicklas 2131         else
2611 29 Aug 14 nicklas 2132         {
2611 29 Aug 14 nicklas 2133           colspan = Math.floor((11-startDate.getMonth())/3) +1;
2611 29 Aug 14 nicklas 2134         }
2611 29 Aug 14 nicklas 2135       }
2611 29 Aug 14 nicklas 2136       else if(currentYear == endDate.getFullYear())
2611 29 Aug 14 nicklas 2137       {
2611 29 Aug 14 nicklas 2138         colspan = Math.floor(endDate.getMonth()/3)+1;
2611 29 Aug 14 nicklas 2139       }
2611 29 Aug 14 nicklas 2140       else 
2611 29 Aug 14 nicklas 2141       {
2611 29 Aug 14 nicklas 2142         colspan = 4;
2611 29 Aug 14 nicklas 2143       }
2611 29 Aug 14 nicklas 2144     }
2611 29 Aug 14 nicklas 2145     else if (vt == "YEAR")
2611 29 Aug 14 nicklas 2146     {
2611 29 Aug 14 nicklas 2147       colspan = 1;        
2611 29 Aug 14 nicklas 2148     }
2611 29 Aug 14 nicklas 2149     columnCounter += colspan;            
2611 29 Aug 14 nicklas 2150     subHeaderRowYear.appendChild(getTableCellElement(headerText, 'reportsubheader', colspan));
2611 29 Aug 14 nicklas 2151   }while(!(++currentYear>endDate.getFullYear()));
2611 29 Aug 14 nicklas 2152 }
2611 29 Aug 14 nicklas 2153
2611 29 Aug 14 nicklas 2154 function addDataRowsToTable(report, reportTable)
2611 29 Aug 14 nicklas 2155 {
2611 29 Aug 14 nicklas 2156   var fdString = report.beginDate;
2611 29 Aug 14 nicklas 2157   var ldString = report.endDate;
2611 29 Aug 14 nicklas 2158   var psdString = report.periodBeginDate;
2611 29 Aug 14 nicklas 2159   var startDate = new Date();
2611 29 Aug 14 nicklas 2160   startDate.setYear(fdString.substr(0,4));
2611 29 Aug 14 nicklas 2161   startDate.setMonth(fdString.substr(4,2)-1);
2611 29 Aug 14 nicklas 2162   startDate.setDate(fdString.substr(6));
2611 29 Aug 14 nicklas 2163   var endDate = new Date();
2611 29 Aug 14 nicklas 2164   endDate.setYear(ldString.substr(0,4));
2611 29 Aug 14 nicklas 2165   endDate.setMonth(ldString.substr(4,2)-1);
2611 29 Aug 14 nicklas 2166   endDate.setDate(ldString.substr(6));
2611 29 Aug 14 nicklas 2167   var periodStartDate = new Date();
2611 29 Aug 14 nicklas 2168   periodStartDate.setYear(psdString.substr(0,4));
2611 29 Aug 14 nicklas 2169   periodStartDate.setMonth(psdString.substr(4,2)-1);
2611 29 Aug 14 nicklas 2170   periodStartDate.setDate(psdString.substr(6));
2611 29 Aug 14 nicklas 2171   var viewType = report.viewType;    
2611 29 Aug 14 nicklas 2172   var sites = report.sites;    
2611 29 Aug 14 nicklas 2173   var statistics = report.statistics;
2611 29 Aug 14 nicklas 2174   unknownCreation = statistics.noDate;
2611 29 Aug 14 nicklas 2175   unknownSite = statistics.unknownSite;
2611 29 Aug 14 nicklas 2176   for (var siteNo = 0; siteNo < sites.length; siteNo++)
2611 29 Aug 14 nicklas 2177   {
2611 29 Aug 14 nicklas 2178     var site = sites[siteNo];
2611 29 Aug 14 nicklas 2179     var siteName = site.name;    
2611 29 Aug 14 nicklas 2180     var year = site.startDate.substr(0,4);
2611 29 Aug 14 nicklas 2181     var month = site.startDate.substr(5,2);
2611 29 Aug 14 nicklas 2182     var date = site.startDate.substr(8,2);      
2611 29 Aug 14 nicklas 2183     var siteStartDate = new Date(year, month-1, date);
2611 29 Aug 14 nicklas 2184     
2611 29 Aug 14 nicklas 2185     var siteData = statistics[site.prefix];
2611 29 Aug 14 nicklas 2186     var siteLatestDate = siteData['latestDateKey'];
2611 29 Aug 14 nicklas 2187     var siteLatestDateStr = '????-??-??';
2611 29 Aug 14 nicklas 2188     if (siteLatestDate != null)
2611 29 Aug 14 nicklas 2189     {
2611 29 Aug 14 nicklas 2190       var siteLatestDateYear = siteLatestDate.substr(0,4);
2611 29 Aug 14 nicklas 2191       var siteLatestDateMonth = siteLatestDate.substr(4,2);
2611 29 Aug 14 nicklas 2192       var siteLatestDateDate = siteLatestDate.substr(6,2);
2611 29 Aug 14 nicklas 2193       siteLatestDateStr = siteLatestDateYear + '-' + siteLatestDateMonth + '-' + siteLatestDateDate;
2611 29 Aug 14 nicklas 2194     }
2611 29 Aug 14 nicklas 2195     var tableRow = document.createElement('tr');
2611 29 Aug 14 nicklas 2196     var tableCol = getTableCellElement(siteName, 'rowtitle');
2611 29 Aug 14 nicklas 2197     tableRow.appendChild(tableCol);
2611 29 Aug 14 nicklas 2198     tableRow.appendChild(getTableCellElement(year+'-'+(month)+'-'+date, 'reportdata'));
2611 29 Aug 14 nicklas 2199     tableRow.appendChild(getTableCellElement(siteLatestDateStr, 'reportdata'));
2611 29 Aug 14 nicklas 2200     var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());      
2611 29 Aug 14 nicklas 2201     var columnCounter = 0;
2611 29 Aug 14 nicklas 2202     do
2611 29 Aug 14 nicklas 2203     {  
2611 29 Aug 14 nicklas 2204       var data = 0;
2611 29 Aug 14 nicklas 2205       var keyIndex;
2611 29 Aug 14 nicklas 2206       var yearIndex = currentDate.getFullYear();
2611 29 Aug 14 nicklas 2207       
2611 29 Aug 14 nicklas 2208       if (viewType == 'YEAR')
2611 29 Aug 14 nicklas 2209       {
2611 29 Aug 14 nicklas 2210         keyIndex = yearIndex;
2611 29 Aug 14 nicklas 2211         if (siteData != null)
2611 29 Aug 14 nicklas 2212         {
2611 29 Aug 14 nicklas 2213           if (siteData[keyIndex] != null) data = siteData[keyIndex];
2611 29 Aug 14 nicklas 2214         }
2611 29 Aug 14 nicklas 2215         // Initialize data columns before site start date to empty string
2611 29 Aug 14 nicklas 2216         if ( (currentDate.getFullYear() < siteStartDate.getFullYear()))
2611 29 Aug 14 nicklas 2217         {
2611 29 Aug 14 nicklas 2218           data = '';
2611 29 Aug 14 nicklas 2219         }
2611 29 Aug 14 nicklas 2220         currentDate.setFullYear(currentDate.getFullYear()+1);
2611 29 Aug 14 nicklas 2221       }
2611 29 Aug 14 nicklas 2222       else if (viewType == 'QUARTER')
2611 29 Aug 14 nicklas 2223       {
2611 29 Aug 14 nicklas 2224         var qIndex = Math.floor(currentDate.getMonth()/3) + 1;
2611 29 Aug 14 nicklas 2225         var startQuarter = Math.floor(siteStartDate.getMonth()/3)+1;
2611 29 Aug 14 nicklas 2226         keyIndex = yearIndex + '' + qIndex;
2611 29 Aug 14 nicklas 2227         if (siteData != null)
2611 29 Aug 14 nicklas 2228         {
2611 29 Aug 14 nicklas 2229           if (siteData[keyIndex] != null) data = siteData[keyIndex];            
2611 29 Aug 14 nicklas 2230         }          
2611 29 Aug 14 nicklas 2231         // Initialize data columns before site start date to empty string
2611 29 Aug 14 nicklas 2232         if ( (currentDate.getFullYear() < siteStartDate.getFullYear()) ||
2611 29 Aug 14 nicklas 2233              (currentDate.getFullYear() == siteStartDate.getFullYear() && qIndex < startQuarter))
2611 29 Aug 14 nicklas 2234         {
2611 29 Aug 14 nicklas 2235           data = '';
2611 29 Aug 14 nicklas 2236         }
2611 29 Aug 14 nicklas 2237         currentDate.setMonth(currentDate.getMonth()+3);          
2611 29 Aug 14 nicklas 2238       }
2611 29 Aug 14 nicklas 2239       else if (viewType == 'MONTH')
2611 29 Aug 14 nicklas 2240       {
2611 29 Aug 14 nicklas 2241         var monthIndex = currentDate.getMonth()+1;
2611 29 Aug 14 nicklas 2242         var rowFill = monthIndex < 10 ? '0' : '';
2611 29 Aug 14 nicklas 2243         keyIndex = yearIndex + rowFill + monthIndex;
2611 29 Aug 14 nicklas 2244         if (siteData != null)
2611 29 Aug 14 nicklas 2245         {
2611 29 Aug 14 nicklas 2246           if (siteData[keyIndex] != null) data = siteData[keyIndex];
2611 29 Aug 14 nicklas 2247         }
2611 29 Aug 14 nicklas 2248         // Initialize data columns before site start date to empty string
2611 29 Aug 14 nicklas 2249         if ( (currentDate.getFullYear() < siteStartDate.getFullYear()) ||
2611 29 Aug 14 nicklas 2250              (currentDate.getFullYear() == siteStartDate.getFullYear() && (monthIndex-1) < siteStartDate.getMonth()))
2611 29 Aug 14 nicklas 2251         {
2611 29 Aug 14 nicklas 2252           data = '';
2611 29 Aug 14 nicklas 2253         }
2611 29 Aug 14 nicklas 2254         currentDate.setMonth(currentDate.getMonth()+1);
2611 29 Aug 14 nicklas 2255       }
2611 29 Aug 14 nicklas 2256       else if (viewType == 'WEEK')
2611 29 Aug 14 nicklas 2257       {
2611 29 Aug 14 nicklas 2258         var weekIndex = getISOWeekNumber(currentDate);
2611 29 Aug 14 nicklas 2259         // Week number in year stored as yyyyww with leading 0 if needed
2611 29 Aug 14 nicklas 2260         if (weekIndex < 10)
2611 29 Aug 14 nicklas 2261         {
2611 29 Aug 14 nicklas 2262           keyIndex = yearIndex + '0' + weekIndex;
2611 29 Aug 14 nicklas 2263         }
2611 29 Aug 14 nicklas 2264         else
2611 29 Aug 14 nicklas 2265         {
2611 29 Aug 14 nicklas 2266           keyIndex = yearIndex + '' + weekIndex;
2611 29 Aug 14 nicklas 2267         }
2611 29 Aug 14 nicklas 2268         if (siteData != null)
2611 29 Aug 14 nicklas 2269         {
2611 29 Aug 14 nicklas 2270           if (siteData[keyIndex] != null) data = siteData[keyIndex];
2611 29 Aug 14 nicklas 2271         }
2611 29 Aug 14 nicklas 2272         // Initialize data columns before site start date to empty string
2611 29 Aug 14 nicklas 2273         //
2611 29 Aug 14 nicklas 2274         // Note: ISO week numbers are tricky in their short form (without being coupled to a year),
2611 29 Aug 14 nicklas 2275         // since days in different years may lie in the same week, and days at the start of
2611 29 Aug 14 nicklas 2276         // a year may have week number 52 or 53 of the previous year and days at the end of
2611 29 Aug 14 nicklas 2277         // a year may have week number 01 of the next year.
2611 29 Aug 14 nicklas 2278         // Example: Monday 2012-01-02 has week number 2012-01, Monday 2012-12-31 has week number 2013-01
2611 29 Aug 14 nicklas 2279         // If current date is before site start date - 6 days, it is in a previous week
2611 29 Aug 14 nicklas 2280         // If current date is within site start date +/- 6 days and not in the same week, check dates
2611 29 Aug 14 nicklas 2281         // (just checking week numbers in the last case leads to e.g. 2012-12-30 (w52) > 2012-12-31 (w01))
2611 29 Aug 14 nicklas 2282         //
2611 29 Aug 14 nicklas 2283         if (currentDate.getTime() < siteStartDate.getTime() - 6*24*3600*1000 ||
2611 29 Aug 14 nicklas 2284             currentDate.getTime() < siteStartDate.getTime() + 6*24*3600*1000 &&
2611 29 Aug 14 nicklas 2285                getISOWeekNumber(currentDate) != getISOWeekNumber(siteStartDate) &&
2611 29 Aug 14 nicklas 2286                currentDate < siteStartDate)
2611 29 Aug 14 nicklas 2287         {
2611 29 Aug 14 nicklas 2288           data = '';
2611 29 Aug 14 nicklas 2289         }
2611 29 Aug 14 nicklas 2290         currentDate.setDate(currentDate.getDate()+7);
2611 29 Aug 14 nicklas 2291       }
2611 29 Aug 14 nicklas 2292       
2611 29 Aug 14 nicklas 2293       tableRow.appendChild(getTableCellElement(data, 'reportdata'));
2611 29 Aug 14 nicklas 2294       columnCounter++;        
2611 29 Aug 14 nicklas 2295     } while (columnCounter < numCols)
2611 29 Aug 14 nicklas 2296     // Add column with sample sum for site for the selected time period
2611 29 Aug 14 nicklas 2297     var siteSum = 0;
2611 29 Aug 14 nicklas 2298     if (siteData != null)
2611 29 Aug 14 nicklas 2299     {
2611 29 Aug 14 nicklas 2300       var sumSiteKey = 'sumSiteKey';
2611 29 Aug 14 nicklas 2301       if (siteData[sumSiteKey] != null)
2611 29 Aug 14 nicklas 2302       {
2611 29 Aug 14 nicklas 2303         siteSum = siteData[sumSiteKey];
2611 29 Aug 14 nicklas 2304       }
2611 29 Aug 14 nicklas 2305     }
2611 29 Aug 14 nicklas 2306     tableRow.appendChild(getTableCellElement(siteSum, 'rowsummary'));
2611 29 Aug 14 nicklas 2307     // Add column with total number of samples for site, regardless of creation date
2611 29 Aug 14 nicklas 2308     var siteTotal = 0;
2611 29 Aug 14 nicklas 2309     if (siteData != null)
2611 29 Aug 14 nicklas 2310     {
2611 29 Aug 14 nicklas 2311       var totalSiteKey = 'totalSiteKey';
2611 29 Aug 14 nicklas 2312       if (siteData[totalSiteKey] != null)
2611 29 Aug 14 nicklas 2313       {
2611 29 Aug 14 nicklas 2314         siteTotal = siteData[totalSiteKey];
2611 29 Aug 14 nicklas 2315       }
2611 29 Aug 14 nicklas 2316     }
2611 29 Aug 14 nicklas 2317     tableRow.appendChild(getTableCellElement(siteTotal, 'rowsummary'));
2611 29 Aug 14 nicklas 2318     reportTable.appendChild(tableRow);
2611 29 Aug 14 nicklas 2319   }
2611 29 Aug 14 nicklas 2320 }
2611 29 Aug 14 nicklas 2321
2611 29 Aug 14 nicklas 2322 function createSortedPeriodArray(report, numberOfColumns)
2611 29 Aug 14 nicklas 2323 {
2611 29 Aug 14 nicklas 2324   var psdString = report.periodBeginDate;
2611 29 Aug 14 nicklas 2325   var periodStartDate = new Date();
2611 29 Aug 14 nicklas 2326   periodStartDate.setYear(psdString.substr(0,4));
2611 29 Aug 14 nicklas 2327   periodStartDate.setMonth(psdString.substr(4,2)-1);
2611 29 Aug 14 nicklas 2328   periodStartDate.setDate(psdString.substr(6));
2611 29 Aug 14 nicklas 2329   var viewType = report.viewType;    
2611 29 Aug 14 nicklas 2330   var sortedPeriodArray = Array(numberOfColumns);
2611 29 Aug 14 nicklas 2331   var currentDate = new Date(periodStartDate.getFullYear(), periodStartDate.getMonth(), periodStartDate.getDate());      
2611 29 Aug 14 nicklas 2332   var columnCounter = 0;
2611 29 Aug 14 nicklas 2333   do
2611 29 Aug 14 nicklas 2334   {  
2611 29 Aug 14 nicklas 2335     var keyIndex;
2611 29 Aug 14 nicklas 2336     var yearIndex = currentDate.getFullYear();
2611 29 Aug 14 nicklas 2337       
2611 29 Aug 14 nicklas 2338     if (viewType == 'YEAR')
2611 29 Aug 14 nicklas 2339     {
2611 29 Aug 14 nicklas 2340       keyIndex = yearIndex;
2611 29 Aug 14 nicklas 2341       currentDate.setFullYear(currentDate.getFullYear()+1);
2611 29 Aug 14 nicklas 2342     }
2611 29 Aug 14 nicklas 2343     else if (viewType == 'QUARTER')
2611 29 Aug 14 nicklas 2344     {
2611 29 Aug 14 nicklas 2345       var qIndex = Math.floor(currentDate.getMonth()/3) + 1;
2611 29 Aug 14 nicklas 2346       keyIndex = yearIndex + '' + qIndex;
2611 29 Aug 14 nicklas 2347       currentDate.setMonth(currentDate.getMonth()+3);          
2611 29 Aug 14 nicklas 2348     }
2611 29 Aug 14 nicklas 2349     else if (viewType == 'MONTH')
2611 29 Aug 14 nicklas 2350     {
2611 29 Aug 14 nicklas 2351       var monthIndex = currentDate.getMonth()+1;
2611 29 Aug 14 nicklas 2352       var rowFill = monthIndex < 10 ? '0' : '';
2611 29 Aug 14 nicklas 2353       keyIndex = yearIndex + rowFill + monthIndex;
2611 29 Aug 14 nicklas 2354       currentDate.setMonth(currentDate.getMonth()+1);
2611 29 Aug 14 nicklas 2355     }
2611 29 Aug 14 nicklas 2356     else if (viewType == 'WEEK')
2611 29 Aug 14 nicklas 2357     {
2611 29 Aug 14 nicklas 2358       var weekIndex = getISOWeekNumber(currentDate);
2611 29 Aug 14 nicklas 2359       // Week number in year stored as yyyyww with leading 0 if needed
2611 29 Aug 14 nicklas 2360       if (weekIndex < 10)
2611 29 Aug 14 nicklas 2361       {
2611 29 Aug 14 nicklas 2362         keyIndex = yearIndex + '0' + weekIndex;
2611 29 Aug 14 nicklas 2363       }
2611 29 Aug 14 nicklas 2364       else
2611 29 Aug 14 nicklas 2365       {
2611 29 Aug 14 nicklas 2366         keyIndex = yearIndex + '' + weekIndex;
2611 29 Aug 14 nicklas 2367       }
2611 29 Aug 14 nicklas 2368       currentDate.setDate(currentDate.getDate()+7);
2611 29 Aug 14 nicklas 2369     }
2611 29 Aug 14 nicklas 2370     sortedPeriodArray[columnCounter] = keyIndex;
2611 29 Aug 14 nicklas 2371     columnCounter++;        
2611 29 Aug 14 nicklas 2372   } while (columnCounter < numberOfColumns)
2611 29 Aug 14 nicklas 2373   return sortedPeriodArray;
2611 29 Aug 14 nicklas 2374 }
2611 29 Aug 14 nicklas 2375
2611 29 Aug 14 nicklas 2376 function getReportTable()
2611 29 Aug 14 nicklas 2377 {
2611 29 Aug 14 nicklas 2378     var reportTable = document.createElement('table');
2611 29 Aug 14 nicklas 2379     reportTable.setAttribute('class','reporttable');
2611 29 Aug 14 nicklas 2380     reportTable.setAttribute('border','1');      
2611 29 Aug 14 nicklas 2381     return reportTable;
2611 29 Aug 14 nicklas 2382 }
2611 29 Aug 14 nicklas 2383
2611 29 Aug 14 nicklas 2384 function getTableCellElement(text, clazz, colspan, rowspan)
2611 29 Aug 14 nicklas 2385 {
2611 29 Aug 14 nicklas 2386   var cellElement = document.createElement('td');
2611 29 Aug 14 nicklas 2387   text = new String(text);    
2611 29 Aug 14 nicklas 2388   var textArray = text.split("\n");    
2611 29 Aug 14 nicklas 2389   if (textArray.length > 1)
2611 29 Aug 14 nicklas 2390   {  
2611 29 Aug 14 nicklas 2391     for (var i=0;i<textArray.length;i++)
2611 29 Aug 14 nicklas 2392     {        
2611 29 Aug 14 nicklas 2393       if (i>0)cellElement.appendChild(document.createElement('br'));
2611 29 Aug 14 nicklas 2394       cellElement.appendChild(document.createTextNode(textArray[i]));
2611 29 Aug 14 nicklas 2395     }      
2611 29 Aug 14 nicklas 2396   }
2611 29 Aug 14 nicklas 2397   else
2611 29 Aug 14 nicklas 2398   {
2611 29 Aug 14 nicklas 2399     cellElement.appendChild(document.createTextNode(text));
2611 29 Aug 14 nicklas 2400   }
2611 29 Aug 14 nicklas 2401   cellElement.setAttribute('class', clazz);
2611 29 Aug 14 nicklas 2402   if (colspan != null) cellElement.setAttribute('colspan', colspan);
2611 29 Aug 14 nicklas 2403   if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
2611 29 Aug 14 nicklas 2404   
2611 29 Aug 14 nicklas 2405   return cellElement;
2611 29 Aug 14 nicklas 2406 }
2611 29 Aug 14 nicklas 2407
2611 29 Aug 14 nicklas 2408 function getListElement(itemText)
2611 29 Aug 14 nicklas 2409 {
2611 29 Aug 14 nicklas 2410   var listElement = document.createElement('li');
2611 29 Aug 14 nicklas 2411   var textNode = document.createTextNode(itemText);
2611 29 Aug 14 nicklas 2412   listElement.appendChild(textNode);
2611 29 Aug 14 nicklas 2413   return listElement;
2611 29 Aug 14 nicklas 2414 }
2611 29 Aug 14 nicklas 2415
2611 29 Aug 14 nicklas 2416 /**
2611 29 Aug 14 nicklas 2417  *  addHyphensToDateStr()
2611 29 Aug 14 nicklas 2418  *
2611 29 Aug 14 nicklas 2419  *  Adds hyphens to date string in yyyymmdd format to
2611 29 Aug 14 nicklas 2420  *  get yyyy-mm-dd format. If input string already contains
2611 29 Aug 14 nicklas 2421  *  hyphen(s), the input string is returned unchanged.
2611 29 Aug 14 nicklas 2422  *  If input string is null or empty, '????-??-??' is returned.
2611 29 Aug 14 nicklas 2423  *
2611 29 Aug 14 nicklas 2424  *  @param dateStr String Input date string in yyyy-mm-dd or yyyymmdd format.
2611 29 Aug 14 nicklas 2425  *  @return String Date string in yyyy-mm-dd format.
2611 29 Aug 14 nicklas 2426  */
2611 29 Aug 14 nicklas 2427 function addHyphensToDateString(dateStr)
2611 29 Aug 14 nicklas 2428 {
2611 29 Aug 14 nicklas 2429   var dateWithHyphensStr = '????-??-??';
2611 29 Aug 14 nicklas 2430   if (dateStr != null && dateStr != '')
2611 29 Aug 14 nicklas 2431   {
2611 29 Aug 14 nicklas 2432     // Check if input string already contains hyphen
2611 29 Aug 14 nicklas 2433     if (dateStr.indexOf("-") >= 0)
2611 29 Aug 14 nicklas 2434     {
2611 29 Aug 14 nicklas 2435       // Date already has hyphen(s)
2611 29 Aug 14 nicklas 2436       dateWithHyphensStr = dateStr;
2611 29 Aug 14 nicklas 2437     }
2611 29 Aug 14 nicklas 2438     else
2611 29 Aug 14 nicklas 2439     {
2611 29 Aug 14 nicklas 2440       // Date in yyyymmdd format
2611 29 Aug 14 nicklas 2441       var yearStr = dateStr.substr(0,4);
2611 29 Aug 14 nicklas 2442       var monthStr = dateStr.substr(4,2);
2611 29 Aug 14 nicklas 2443       var dayStr = dateStr.substr(6,2);      
2611 29 Aug 14 nicklas 2444       dateWithHyphensStr = yearStr + '-' + monthStr + '-' + dayStr;
2611 29 Aug 14 nicklas 2445     }
2611 29 Aug 14 nicklas 2446   }
2611 29 Aug 14 nicklas 2447   return dateWithHyphensStr;
2611 29 Aug 14 nicklas 2448 }
2611 29 Aug 14 nicklas 2449
2611 29 Aug 14 nicklas 2450 /**
2611 29 Aug 14 nicklas 2451  *  dateStrToDate()
2611 29 Aug 14 nicklas 2452  *
2611 29 Aug 14 nicklas 2453  *  Takes an input date string in yyyy-mm-dd or yyyymmdd format
2611 29 Aug 14 nicklas 2454  *  and returns a date corresponding to the date string.
2611 29 Aug 14 nicklas 2455  *  If input string is null or empty, null is returned.
2611 29 Aug 14 nicklas 2456  *
2611 29 Aug 14 nicklas 2457  *  @param dateStr String Input date string in yyyy-mm-dd or yyyymmdd format.
2611 29 Aug 14 nicklas 2458  *  @return Date Date corresponding to input date string.
2611 29 Aug 14 nicklas 2459  */
2611 29 Aug 14 nicklas 2460 function dateStrToDate(dateStr)
2611 29 Aug 14 nicklas 2461 {
2611 29 Aug 14 nicklas 2462   var date = null;
2611 29 Aug 14 nicklas 2463   if (dateStr != null && dateStr != '')
2611 29 Aug 14 nicklas 2464   {
2611 29 Aug 14 nicklas 2465     // Check if input string already contains hyphen
2611 29 Aug 14 nicklas 2466     if (dateStr.indexOf("-") >= 0)
2611 29 Aug 14 nicklas 2467     {
2611 29 Aug 14 nicklas 2468       // Date in yyyy-mm-dd format
2611 29 Aug 14 nicklas 2469       var yearStr = dateStr.substr(0,4);
2611 29 Aug 14 nicklas 2470       var monthStr = dateStr.substr(5,2);
2611 29 Aug 14 nicklas 2471       var dayStr = dateStr.substr(8,2);      
2611 29 Aug 14 nicklas 2472       var date = new Date(parseInt(yearStr, 10), parseInt(monthStr, 10)-1, parseInt(dayStr, 10));
2611 29 Aug 14 nicklas 2473     }
2611 29 Aug 14 nicklas 2474     else
2611 29 Aug 14 nicklas 2475     {
2611 29 Aug 14 nicklas 2476       // Date in yyyymmdd format
2611 29 Aug 14 nicklas 2477       var yearStr = dateStr.substr(0,4);
2611 29 Aug 14 nicklas 2478       var monthStr = dateStr.substr(4,2);
2611 29 Aug 14 nicklas 2479       var dayStr = dateStr.substr(6,2);      
2611 29 Aug 14 nicklas 2480       var date = new Date(parseInt(yearStr, 10), parseInt(monthStr, 10)-1, parseInt(dayStr, 10));
2611 29 Aug 14 nicklas 2481     }
2611 29 Aug 14 nicklas 2482   }
2611 29 Aug 14 nicklas 2483   return date;
2611 29 Aug 14 nicklas 2484 }
2611 29 Aug 14 nicklas 2485
2611 29 Aug 14 nicklas 2486 /*
2611 29 Aug 14 nicklas 2487  *  Get the ISO week number for a given date
2611 29 Aug 14 nicklas 2488  * 
2611 29 Aug 14 nicklas 2489  *  Based on code at http://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php
2611 29 Aug 14 nicklas 2490  *
2611 29 Aug 14 nicklas 2491  *  @param date String Input date to get ISO week number for.
2611 29 Aug 14 nicklas 2492  *  @return int ISO week number for input date.
2611 29 Aug 14 nicklas 2493  */
2611 29 Aug 14 nicklas 2494 function getISOWeekNumber(date)
2611 29 Aug 14 nicklas 2495 {
2611 29 Aug 14 nicklas 2496   tmpDate = new Date(date);
2611 29 Aug 14 nicklas 2497   tmpDate.setHours(0,0,0);
2611 29 Aug 14 nicklas 2498   // Set to nearest Thursday: current date + 4 - current day number
2611 29 Aug 14 nicklas 2499   // Make Sunday day number 7
2611 29 Aug 14 nicklas 2500   tmpDate.setDate(tmpDate.getDate() + 4 - (tmpDate.getDay() || 7));
2611 29 Aug 14 nicklas 2501   // Get first day of year
2611 29 Aug 14 nicklas 2502   var yearStart = new Date(tmpDate.getFullYear(), 0, 1);
2611 29 Aug 14 nicklas 2503   // Calculate full weeks to nearast Thursday (86400000 = 24*60*60*1000 number of ms in a day)
2611 29 Aug 14 nicklas 2504   var weekNo = Math.ceil(( ( (tmpDate - yearStart) / 86400000) + 1)/7);
2611 29 Aug 14 nicklas 2505   return weekNo;
2611 29 Aug 14 nicklas 2506 }
2611 29 Aug 14 nicklas 2507
2611 29 Aug 14 nicklas 2508
2611 29 Aug 14 nicklas 2509 function getBloodSampleFilterDisplayText(bloodSampleFilter)
2611 29 Aug 14 nicklas 2510 {
2611 29 Aug 14 nicklas 2511   var bloodSampleFilterDisplayText = bloodSampleFilter;
2611 29 Aug 14 nicklas 2512   if (bloodSampleFilter == 'followup')
2611 29 Aug 14 nicklas 2513   {
2611 29 Aug 14 nicklas 2514     bloodSampleFilterDisplayText = 'Follow-up';
2611 29 Aug 14 nicklas 2515   }
2611 29 Aug 14 nicklas 2516   else if (bloodSampleFilter == 'notfollowup')
2611 29 Aug 14 nicklas 2517   {
2611 29 Aug 14 nicklas 2518     bloodSampleFilterDisplayText = 'Not follow-up';
2611 29 Aug 14 nicklas 2519   }
2611 29 Aug 14 nicklas 2520   else if (bloodSampleFilter == '')
2611 29 Aug 14 nicklas 2521   {
2611 29 Aug 14 nicklas 2522     bloodSampleFilterDisplayText = 'unknown';
2611 29 Aug 14 nicklas 2523   }
2611 29 Aug 14 nicklas 2524   return bloodSampleFilterDisplayText;
2611 29 Aug 14 nicklas 2525 }