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

Code
Comments
Other
Rev Date Author Line
2608 28 Aug 14 nicklas 1 var Report = function()
2608 28 Aug 14 nicklas 2 {
2608 28 Aug 14 nicklas 3   var report = {};
2656 11 Sep 14 nicklas 4   var debug = 0;
2608 28 Aug 14 nicklas 5   
2608 28 Aug 14 nicklas 6   var PLOT_WIDTH = 700;
2608 28 Aug 14 nicklas 7   var PLOT_HEIGHT = 550;
2608 28 Aug 14 nicklas 8   var PLOT_SCALE = 2;
2608 28 Aug 14 nicklas 9   
2608 28 Aug 14 nicklas 10   var periodIsValid = true;
2608 28 Aug 14 nicklas 11   var xGuide;
2608 28 Aug 14 nicklas 12   var yGuide;
2608 28 Aug 14 nicklas 13   
2608 28 Aug 14 nicklas 14   report.initPage = function()
2608 28 Aug 14 nicklas 15   {
2608 28 Aug 14 nicklas 16     var frm = document.forms['reggie'];
2608 28 Aug 14 nicklas 17
2608 28 Aug 14 nicklas 18     // Step 1
2608 28 Aug 14 nicklas 19     Events.addEventHandler('fromdate', 'blur', report.dateOnChange)
2608 28 Aug 14 nicklas 20     Events.addEventHandler('todate', 'blur', report.dateOnChange)
2608 28 Aug 14 nicklas 21     Events.addEventHandler('step-1', 'wizard-validate', report.validateStep1);
2608 28 Aug 14 nicklas 22     
2608 28 Aug 14 nicklas 23     // Step 2
2608 28 Aug 14 nicklas 24     Events.addEventHandler('printButton', 'click', report.printVersion);
2608 28 Aug 14 nicklas 25     
2608 28 Aug 14 nicklas 26     // Navigation
2608 28 Aug 14 nicklas 27     Buttons.addClickHandler('gocancel', Wizard.cancelWizard);
2608 28 Aug 14 nicklas 28     Buttons.addClickHandler('gorestart', Wizard.restartWizard);
2608 28 Aug 14 nicklas 29     Buttons.addClickHandler('gonext', Wizard.goNextOnClick);
2608 28 Aug 14 nicklas 30     Buttons.addClickHandler('gocreate', Wizard.goRegister);
2608 28 Aug 14 nicklas 31   
2608 28 Aug 14 nicklas 32     // Final registration
2608 28 Aug 14 nicklas 33     Events.addEventHandler('wizard', 'wizard-submit', report.submit);
2608 28 Aug 14 nicklas 34     
2608 28 Aug 14 nicklas 35     Doc.show('step-1');
2608 28 Aug 14 nicklas 36     Doc.show('gocreate');
2608 28 Aug 14 nicklas 37     frm.fromdate.focus();
2608 28 Aug 14 nicklas 38
2608 28 Aug 14 nicklas 39     // Load sites
2608 28 Aug 14 nicklas 40     var url = '../ScanBQuarterMonthReport.servlet?ID='+App.getSessionId();
2608 28 Aug 14 nicklas 41     url += '&cmd=GetSites';    
2608 28 Aug 14 nicklas 42     Doc.addClass('sites', 'list-loading');
2608 28 Aug 14 nicklas 43     frm.sites[0] = new Option('loading...');
2608 28 Aug 14 nicklas 44     Wizard.asyncJsonRequest(url, report.sitesLoaded);
2608 28 Aug 14 nicklas 45   }
2608 28 Aug 14 nicklas 46   
2608 28 Aug 14 nicklas 47   
2608 28 Aug 14 nicklas 48   report.sitesLoaded = function(response)
2608 28 Aug 14 nicklas 49   {
2608 28 Aug 14 nicklas 50     Doc.removeClass('sites', 'list-loading');
2608 28 Aug 14 nicklas 51     var frm = document.forms['reggie'];
2608 28 Aug 14 nicklas 52     var sites = response.sites;
2608 28 Aug 14 nicklas 53     frm.sites.length = 0;
2608 28 Aug 14 nicklas 54     frm.sites[0] = new Option('All sites together', '');
2608 28 Aug 14 nicklas 55     for (var i = 0; i < sites.length; i++)
2608 28 Aug 14 nicklas 56     {
2608 28 Aug 14 nicklas 57       var s = sites[i];
2608 28 Aug 14 nicklas 58       var option = new Option(s.name, s.prefix);
2608 28 Aug 14 nicklas 59       frm.sites[frm.sites.length] = option;
2608 28 Aug 14 nicklas 60     }
2608 28 Aug 14 nicklas 61   }
2608 28 Aug 14 nicklas 62
2608 28 Aug 14 nicklas 63   report.dateOnChange = function()
2608 28 Aug 14 nicklas 64   {
2608 28 Aug 14 nicklas 65     var frm = document.forms['reggie'];    
2608 28 Aug 14 nicklas 66     var fromDate = frm.fromdate.value;
2608 28 Aug 14 nicklas 67     var toDate = frm.todate.value;
2608 28 Aug 14 nicklas 68     
2608 28 Aug 14 nicklas 69     periodIsValid = false;
2608 28 Aug 14 nicklas 70     Wizard.setInputStatus('period');
2608 28 Aug 14 nicklas 71
2608 28 Aug 14 nicklas 72     if (fromDate != '')
2608 28 Aug 14 nicklas 73     {
2608 28 Aug 14 nicklas 74       fromDate = Reggie.autoFillDate(fromDate, true);
2608 28 Aug 14 nicklas 75       frm.fromdate.value = fromDate;      
2608 28 Aug 14 nicklas 76       if (!Dates.isDate(fromDate, 'yyyyMMdd'))
2608 28 Aug 14 nicklas 77       {
2608 28 Aug 14 nicklas 78         Wizard.setInputStatus('period', 'invalid', 'Not a valid from-date');
2608 28 Aug 14 nicklas 79         return;
2608 28 Aug 14 nicklas 80       }
2608 28 Aug 14 nicklas 81     }
2608 28 Aug 14 nicklas 82
2608 28 Aug 14 nicklas 83     if (toDate != '')
2608 28 Aug 14 nicklas 84     {
2608 28 Aug 14 nicklas 85       toDate = Reggie.autoFillDate(toDate, true);
2608 28 Aug 14 nicklas 86       frm.todate.value = toDate;      
2608 28 Aug 14 nicklas 87       if (!Dates.isDate(toDate, 'yyyyMMdd'))
2608 28 Aug 14 nicklas 88       {
2608 28 Aug 14 nicklas 89         Wizard.setInputStatus('period', 'invalid', 'Not a valid to-date');
2608 28 Aug 14 nicklas 90         return;
2608 28 Aug 14 nicklas 91       }
2608 28 Aug 14 nicklas 92     }
2608 28 Aug 14 nicklas 93     
2608 28 Aug 14 nicklas 94     if (toDate && fromDate)
2608 28 Aug 14 nicklas 95     {
2608 28 Aug 14 nicklas 96       if (fromDate > toDate)
2608 28 Aug 14 nicklas 97       {
2608 28 Aug 14 nicklas 98         Wizard.setInputStatus('period', 'invalid', 'Invalid period')
2608 28 Aug 14 nicklas 99         return;
2608 28 Aug 14 nicklas 100       }      
2608 28 Aug 14 nicklas 101     }
2608 28 Aug 14 nicklas 102     
2608 28 Aug 14 nicklas 103     Wizard.setInputStatus('period', 'valid');
2608 28 Aug 14 nicklas 104     periodIsValid = true;
2608 28 Aug 14 nicklas 105   }
2608 28 Aug 14 nicklas 106
2608 28 Aug 14 nicklas 107   
2608 28 Aug 14 nicklas 108   report.validateStep1 = function(event)
2608 28 Aug 14 nicklas 109   {
2608 28 Aug 14 nicklas 110     if (!periodIsValid) event.preventDefault();
2608 28 Aug 14 nicklas 111   }
2608 28 Aug 14 nicklas 112   
2608 28 Aug 14 nicklas 113   
6824 30 Aug 22 nicklas 114   report.submit = function()
2608 28 Aug 14 nicklas 115   {
2608 28 Aug 14 nicklas 116     var frm = document.forms['reggie'];
2608 28 Aug 14 nicklas 117     
2608 28 Aug 14 nicklas 118     var url = '../ScanBQuarterMonthReport.servlet?ID='+App.getSessionId();
2608 28 Aug 14 nicklas 119     url += '&cmd=scanbquartermonthreport';
2608 28 Aug 14 nicklas 120     url += '&fdate='+encodeURIComponent(frm.fromdate.value);
2608 28 Aug 14 nicklas 121     url += '&tdate='+encodeURIComponent(frm.todate.value);
2608 28 Aug 14 nicklas 122     url += '&vtype='+encodeURIComponent(frm.viewtype.value);
2608 28 Aug 14 nicklas 123     url += '&site='+encodeURIComponent(frm.sites.value);
2608 28 Aug 14 nicklas 124     url += '&cvariant='+encodeURIComponent(frm.chartvariant.value);
2608 28 Aug 14 nicklas 125     
3907 29 Apr 16 nicklas 126     Wizard.showLoadingAnimation('Generating plots...', 'scanbquartermonthreport-progress');
2608 28 Aug 14 nicklas 127     request = Wizard.asyncJsonRequest(url, report.onPlotGenerated);
2608 28 Aug 14 nicklas 128   }
2608 28 Aug 14 nicklas 129
2608 28 Aug 14 nicklas 130   report.onPlotGenerated = function(response)
2608 28 Aug 14 nicklas 131   {
2608 28 Aug 14 nicklas 132     request = null;
2608 28 Aug 14 nicklas 133
2608 28 Aug 14 nicklas 134     var plotReport = response.report;
2608 28 Aug 14 nicklas 135     var reportDiv = Doc.element('reportdiv');
2608 28 Aug 14 nicklas 136     
2608 28 Aug 14 nicklas 137     var plots = plotReport.plotStatistics;
2608 28 Aug 14 nicklas 138     // Draw plots
2608 28 Aug 14 nicklas 139     for (var plotNo = 0; plotNo < plots.length; plotNo++)
2608 28 Aug 14 nicklas 140     {
2608 28 Aug 14 nicklas 141       // Get plot JSON data container with extra info and plot data
2608 28 Aug 14 nicklas 142       var plot = plots[plotNo];
2608 28 Aug 14 nicklas 143
2608 28 Aug 14 nicklas 144       // Get plot JSON extra info and plot data
2608 28 Aug 14 nicklas 145       var plotChartVariant = plot.chartVariant;
2608 28 Aug 14 nicklas 146       var plotViewType = plot.viewType;
2608 28 Aug 14 nicklas 147       var plotOptionalHeadline = plot.optionalHeadline;
2608 28 Aug 14 nicklas 148       var boxPlotJsonData = plot.plotData;
2608 28 Aug 14 nicklas 149
2608 28 Aug 14 nicklas 150       // Create plot from plot JSON data
2608 28 Aug 14 nicklas 151       if (plotOptionalHeadline != null && plotOptionalHeadline != '')
2608 28 Aug 14 nicklas 152       {
2608 28 Aug 14 nicklas 153         // Print optional headline
2608 28 Aug 14 nicklas 154         var headlineText = document.createElement('text');
2608 28 Aug 14 nicklas 155         headlineText.innerHTML = "<BR>" + plotOptionalHeadline + "<BR>";
2608 28 Aug 14 nicklas 156         reportDiv.appendChild(headlineText);
2608 28 Aug 14 nicklas 157       }
2608 28 Aug 14 nicklas 158
2608 28 Aug 14 nicklas 159       var plotKey = plotChartVariant + '_' + plotViewType;
2608 28 Aug 14 nicklas 160 /*
2608 28 Aug 14 nicklas 161           // Add plot key as debug text
2608 28 Aug 14 nicklas 162           var debugText = document.createElement('text');
2608 28 Aug 14 nicklas 163           debugText.innerHTML = "<BR>" + plotKey + "<BR>";
2608 28 Aug 14 nicklas 164           reportDiv.appendChild(spacer);
2608 28 Aug 14 nicklas 165           reportDiv.appendChild(debugText);
2608 28 Aug 14 nicklas 166 */
2608 28 Aug 14 nicklas 167       // Add plot
2608 28 Aug 14 nicklas 168       var canvasInTable = document.createElement('canvas');
2608 28 Aug 14 nicklas 169       canvasInTable.setAttribute('id', plotKey);
2608 28 Aug 14 nicklas 170       canvasInTable.setAttribute('width', PLOT_WIDTH * PLOT_SCALE);
2608 28 Aug 14 nicklas 171       canvasInTable.setAttribute('height', PLOT_HEIGHT * PLOT_SCALE);
2608 28 Aug 14 nicklas 172       createBoxPlot(boxPlotJsonData, canvasInTable, PLOT_WIDTH, PLOT_HEIGHT, PLOT_SCALE);
2608 28 Aug 14 nicklas 173       reportDiv.appendChild(canvasInTable);          
2608 28 Aug 14 nicklas 174       canvasInTable.addEventListener('mousemove', report.drawCanvasGuidelines, false);
2608 28 Aug 14 nicklas 175       canvasInTable.addEventListener('mouseleave', report.hideCanvasGuidelines, false);
2608 28 Aug 14 nicklas 176     }
2608 28 Aug 14 nicklas 177     
2608 28 Aug 14 nicklas 178     // Print optional appended info
2608 28 Aug 14 nicklas 179     var appendedInfo = plotReport.appendedInfo;
2608 28 Aug 14 nicklas 180     if (appendedInfo != null && appendedInfo != '')
2608 28 Aug 14 nicklas 181     {
2608 28 Aug 14 nicklas 182       // Print optional headline
2608 28 Aug 14 nicklas 183       var infoText = document.createElement('text');
2608 28 Aug 14 nicklas 184       infoText.innerHTML = "<BR>" + appendedInfo + "<BR>";
2608 28 Aug 14 nicklas 185       reportDiv.appendChild(infoText);
2608 28 Aug 14 nicklas 186     }
2608 28 Aug 14 nicklas 187     
2608 28 Aug 14 nicklas 188     var caseSummary = reportDiv.getElementsByClassName('case-summary');
2608 28 Aug 14 nicklas 189     for (var i = 0; i < caseSummary.length; i++)
2608 28 Aug 14 nicklas 190     {
2608 28 Aug 14 nicklas 191       var cs = caseSummary[i];
5019 10 Oct 18 nicklas 192       Events.addEventHandler(cs, 'click', Reggie.openCaseSummaryPopupOnEvent);
2608 28 Aug 14 nicklas 193     }
2608 28 Aug 14 nicklas 194     
2608 28 Aug 14 nicklas 195     Doc.show('step-2');
2608 28 Aug 14 nicklas 196     Doc.show('printButton');
2608 28 Aug 14 nicklas 197     Doc.show('gorestart');    
2608 28 Aug 14 nicklas 198
2608 28 Aug 14 nicklas 199   }
2608 28 Aug 14 nicklas 200   
2608 28 Aug 14 nicklas 201   report.drawCanvasGuidelines = function(event)
2608 28 Aug 14 nicklas 202   {
2608 28 Aug 14 nicklas 203     if (!xGuide)
2608 28 Aug 14 nicklas 204     {
2608 28 Aug 14 nicklas 205       xGuide = Doc.element('x-guide');
2608 28 Aug 14 nicklas 206       yGuide = Doc.element('y-guide');
2608 28 Aug 14 nicklas 207     }
2608 28 Aug 14 nicklas 208     var canvas = event.target;
2608 28 Aug 14 nicklas 209     var centerX = event.clientX;
2608 28 Aug 14 nicklas 210     var centerY = event.clientY;
2608 28 Aug 14 nicklas 211     var canvasPos = Doc.getElementPosition(canvas);
2608 28 Aug 14 nicklas 212     var startX = canvasPos.left+50;
2608 28 Aug 14 nicklas 213     var widthX = canvasPos.width-100;
2608 28 Aug 14 nicklas 214     var startY = canvasPos.top+80;
2608 28 Aug 14 nicklas 215     var heightY = canvasPos.height-160;
2608 28 Aug 14 nicklas 216     if (centerY < startY || centerY > startY+heightY)
2608 28 Aug 14 nicklas 217     {
2608 28 Aug 14 nicklas 218       // Hide when mouse is in the text area below or over the plot
2608 28 Aug 14 nicklas 219       yGuide.style.display = 'none';
2608 28 Aug 14 nicklas 220     }
2608 28 Aug 14 nicklas 221     else
2608 28 Aug 14 nicklas 222     {
2608 28 Aug 14 nicklas 223       yGuide.style.top = (centerY-2) + 'px';
2608 28 Aug 14 nicklas 224       yGuide.style.left = startX + 'px';
2608 28 Aug 14 nicklas 225       yGuide.style.width = widthX + 'px';
2608 28 Aug 14 nicklas 226       yGuide.style.display = 'block';
2608 28 Aug 14 nicklas 227     }
2608 28 Aug 14 nicklas 228     if (centerX < startX || centerX > startX + widthX)
2608 28 Aug 14 nicklas 229     {
2608 28 Aug 14 nicklas 230       // Hide when mouse is in the text area to the left or right of the plot
2608 28 Aug 14 nicklas 231       xGuide.style.display = 'none';
2608 28 Aug 14 nicklas 232     }
2608 28 Aug 14 nicklas 233     else
2608 28 Aug 14 nicklas 234     {
2608 28 Aug 14 nicklas 235       // Avoid drawing outside the avilable hight (causes an extra pair of scroll bars)
2842 20 Oct 14 nicklas 236       var yLimit = App.getWindowPosition().height;
2608 28 Aug 14 nicklas 237       if (startY+heightY > yLimit)
2608 28 Aug 14 nicklas 238       {
2608 28 Aug 14 nicklas 239         heightY = yLimit-startY;
2608 28 Aug 14 nicklas 240       }
2608 28 Aug 14 nicklas 241       xGuide.style.top = startY + 'px';
2608 28 Aug 14 nicklas 242       xGuide.style.left = (centerX-2) + 'px';
2608 28 Aug 14 nicklas 243       xGuide.style.height = heightY + 'px';
2608 28 Aug 14 nicklas 244       xGuide.style.display = 'block';
2608 28 Aug 14 nicklas 245     }
2608 28 Aug 14 nicklas 246
2608 28 Aug 14 nicklas 247   }
2608 28 Aug 14 nicklas 248   
6824 30 Aug 22 nicklas 249   report.hideCanvasGuidelines = function()
2608 28 Aug 14 nicklas 250   {
2608 28 Aug 14 nicklas 251     xGuide.style.display = 'none';
2608 28 Aug 14 nicklas 252     yGuide.style.display = 'none';
2608 28 Aug 14 nicklas 253   }
2608 28 Aug 14 nicklas 254
2608 28 Aug 14 nicklas 255   
2608 28 Aug 14 nicklas 256   report.printVersion = function()
2608 28 Aug 14 nicklas 257   {
2608 28 Aug 14 nicklas 258     var printNote = '<b>Note!</b> For better printing set page orientation to <i>portrait</i>.';
2608 28 Aug 14 nicklas 259     printNote += ' Scale down to <i>90%</i> to fit 2 plots per page.';
2608 28 Aug 14 nicklas 260     Reggie.openPrintWindow('step-2-content', 'Sample processing statistics', 'portrait', printNote, '../', 'report.css');
2608 28 Aug 14 nicklas 261   }
2608 28 Aug 14 nicklas 262
2608 28 Aug 14 nicklas 263   return report;
2608 28 Aug 14 nicklas 264 }();
2608 28 Aug 14 nicklas 265
2608 28 Aug 14 nicklas 266 Doc.onLoad(Report.initPage);