2608 |
28 Aug 14 |
nicklas |
var Report = function() |
2608 |
28 Aug 14 |
nicklas |
2 |
{ |
2608 |
28 Aug 14 |
nicklas |
var report = {}; |
2656 |
11 Sep 14 |
nicklas |
var debug = 0; |
2608 |
28 Aug 14 |
nicklas |
5 |
|
2608 |
28 Aug 14 |
nicklas |
var PLOT_WIDTH = 700; |
2608 |
28 Aug 14 |
nicklas |
var PLOT_HEIGHT = 550; |
2608 |
28 Aug 14 |
nicklas |
var PLOT_SCALE = 2; |
2608 |
28 Aug 14 |
nicklas |
9 |
|
2608 |
28 Aug 14 |
nicklas |
var periodIsValid = true; |
2608 |
28 Aug 14 |
nicklas |
var xGuide; |
2608 |
28 Aug 14 |
nicklas |
var yGuide; |
2608 |
28 Aug 14 |
nicklas |
13 |
|
2608 |
28 Aug 14 |
nicklas |
report.initPage = function() |
2608 |
28 Aug 14 |
nicklas |
15 |
{ |
2608 |
28 Aug 14 |
nicklas |
var frm = document.forms['reggie']; |
2608 |
28 Aug 14 |
nicklas |
17 |
|
2608 |
28 Aug 14 |
nicklas |
// Step 1 |
2608 |
28 Aug 14 |
nicklas |
Events.addEventHandler('fromdate', 'blur', report.dateOnChange) |
2608 |
28 Aug 14 |
nicklas |
Events.addEventHandler('todate', 'blur', report.dateOnChange) |
2608 |
28 Aug 14 |
nicklas |
Events.addEventHandler('step-1', 'wizard-validate', report.validateStep1); |
2608 |
28 Aug 14 |
nicklas |
22 |
|
2608 |
28 Aug 14 |
nicklas |
// Step 2 |
2608 |
28 Aug 14 |
nicklas |
Events.addEventHandler('printButton', 'click', report.printVersion); |
2608 |
28 Aug 14 |
nicklas |
25 |
|
2608 |
28 Aug 14 |
nicklas |
// Navigation |
2608 |
28 Aug 14 |
nicklas |
Buttons.addClickHandler('gocancel', Wizard.cancelWizard); |
2608 |
28 Aug 14 |
nicklas |
Buttons.addClickHandler('gorestart', Wizard.restartWizard); |
2608 |
28 Aug 14 |
nicklas |
Buttons.addClickHandler('gonext', Wizard.goNextOnClick); |
2608 |
28 Aug 14 |
nicklas |
Buttons.addClickHandler('gocreate', Wizard.goRegister); |
2608 |
28 Aug 14 |
nicklas |
31 |
|
2608 |
28 Aug 14 |
nicklas |
// Final registration |
2608 |
28 Aug 14 |
nicklas |
Events.addEventHandler('wizard', 'wizard-submit', report.submit); |
2608 |
28 Aug 14 |
nicklas |
34 |
|
2608 |
28 Aug 14 |
nicklas |
Doc.show('step-1'); |
2608 |
28 Aug 14 |
nicklas |
Doc.show('gocreate'); |
2608 |
28 Aug 14 |
nicklas |
frm.fromdate.focus(); |
2608 |
28 Aug 14 |
nicklas |
38 |
|
2608 |
28 Aug 14 |
nicklas |
// Load sites |
2608 |
28 Aug 14 |
nicklas |
var url = '../ScanBQuarterMonthReport.servlet?ID='+App.getSessionId(); |
2608 |
28 Aug 14 |
nicklas |
url += '&cmd=GetSites'; |
2608 |
28 Aug 14 |
nicklas |
Doc.addClass('sites', 'list-loading'); |
2608 |
28 Aug 14 |
nicklas |
frm.sites[0] = new Option('loading...'); |
2608 |
28 Aug 14 |
nicklas |
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 |
report.sitesLoaded = function(response) |
2608 |
28 Aug 14 |
nicklas |
49 |
{ |
2608 |
28 Aug 14 |
nicklas |
Doc.removeClass('sites', 'list-loading'); |
2608 |
28 Aug 14 |
nicklas |
var frm = document.forms['reggie']; |
2608 |
28 Aug 14 |
nicklas |
var sites = response.sites; |
2608 |
28 Aug 14 |
nicklas |
frm.sites.length = 0; |
2608 |
28 Aug 14 |
nicklas |
frm.sites[0] = new Option('All sites together', ''); |
2608 |
28 Aug 14 |
nicklas |
for (var i = 0; i < sites.length; i++) |
2608 |
28 Aug 14 |
nicklas |
56 |
{ |
2608 |
28 Aug 14 |
nicklas |
var s = sites[i]; |
2608 |
28 Aug 14 |
nicklas |
var option = new Option(s.name, s.prefix); |
2608 |
28 Aug 14 |
nicklas |
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 |
report.dateOnChange = function() |
2608 |
28 Aug 14 |
nicklas |
64 |
{ |
2608 |
28 Aug 14 |
nicklas |
var frm = document.forms['reggie']; |
2608 |
28 Aug 14 |
nicklas |
var fromDate = frm.fromdate.value; |
2608 |
28 Aug 14 |
nicklas |
var toDate = frm.todate.value; |
2608 |
28 Aug 14 |
nicklas |
68 |
|
2608 |
28 Aug 14 |
nicklas |
periodIsValid = false; |
2608 |
28 Aug 14 |
nicklas |
Wizard.setInputStatus('period'); |
2608 |
28 Aug 14 |
nicklas |
71 |
|
2608 |
28 Aug 14 |
nicklas |
if (fromDate != '') |
2608 |
28 Aug 14 |
nicklas |
73 |
{ |
2608 |
28 Aug 14 |
nicklas |
fromDate = Reggie.autoFillDate(fromDate, true); |
2608 |
28 Aug 14 |
nicklas |
frm.fromdate.value = fromDate; |
2608 |
28 Aug 14 |
nicklas |
if (!Dates.isDate(fromDate, 'yyyyMMdd')) |
2608 |
28 Aug 14 |
nicklas |
77 |
{ |
2608 |
28 Aug 14 |
nicklas |
Wizard.setInputStatus('period', 'invalid', 'Not a valid from-date'); |
2608 |
28 Aug 14 |
nicklas |
return; |
2608 |
28 Aug 14 |
nicklas |
80 |
} |
2608 |
28 Aug 14 |
nicklas |
81 |
} |
2608 |
28 Aug 14 |
nicklas |
82 |
|
2608 |
28 Aug 14 |
nicklas |
if (toDate != '') |
2608 |
28 Aug 14 |
nicklas |
84 |
{ |
2608 |
28 Aug 14 |
nicklas |
toDate = Reggie.autoFillDate(toDate, true); |
2608 |
28 Aug 14 |
nicklas |
frm.todate.value = toDate; |
2608 |
28 Aug 14 |
nicklas |
if (!Dates.isDate(toDate, 'yyyyMMdd')) |
2608 |
28 Aug 14 |
nicklas |
88 |
{ |
2608 |
28 Aug 14 |
nicklas |
Wizard.setInputStatus('period', 'invalid', 'Not a valid to-date'); |
2608 |
28 Aug 14 |
nicklas |
return; |
2608 |
28 Aug 14 |
nicklas |
91 |
} |
2608 |
28 Aug 14 |
nicklas |
92 |
} |
2608 |
28 Aug 14 |
nicklas |
93 |
|
2608 |
28 Aug 14 |
nicklas |
if (toDate && fromDate) |
2608 |
28 Aug 14 |
nicklas |
95 |
{ |
2608 |
28 Aug 14 |
nicklas |
if (fromDate > toDate) |
2608 |
28 Aug 14 |
nicklas |
97 |
{ |
2608 |
28 Aug 14 |
nicklas |
Wizard.setInputStatus('period', 'invalid', 'Invalid period') |
2608 |
28 Aug 14 |
nicklas |
return; |
2608 |
28 Aug 14 |
nicklas |
100 |
} |
2608 |
28 Aug 14 |
nicklas |
101 |
} |
2608 |
28 Aug 14 |
nicklas |
102 |
|
2608 |
28 Aug 14 |
nicklas |
Wizard.setInputStatus('period', 'valid'); |
2608 |
28 Aug 14 |
nicklas |
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 |
report.validateStep1 = function(event) |
2608 |
28 Aug 14 |
nicklas |
109 |
{ |
2608 |
28 Aug 14 |
nicklas |
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 |
report.submit = function() |
2608 |
28 Aug 14 |
nicklas |
115 |
{ |
2608 |
28 Aug 14 |
nicklas |
var frm = document.forms['reggie']; |
2608 |
28 Aug 14 |
nicklas |
117 |
|
2608 |
28 Aug 14 |
nicklas |
var url = '../ScanBQuarterMonthReport.servlet?ID='+App.getSessionId(); |
2608 |
28 Aug 14 |
nicklas |
url += '&cmd=scanbquartermonthreport'; |
2608 |
28 Aug 14 |
nicklas |
url += '&fdate='+encodeURIComponent(frm.fromdate.value); |
2608 |
28 Aug 14 |
nicklas |
url += '&tdate='+encodeURIComponent(frm.todate.value); |
2608 |
28 Aug 14 |
nicklas |
url += '&vtype='+encodeURIComponent(frm.viewtype.value); |
2608 |
28 Aug 14 |
nicklas |
url += '&site='+encodeURIComponent(frm.sites.value); |
2608 |
28 Aug 14 |
nicklas |
url += '&cvariant='+encodeURIComponent(frm.chartvariant.value); |
2608 |
28 Aug 14 |
nicklas |
125 |
|
3907 |
29 Apr 16 |
nicklas |
Wizard.showLoadingAnimation('Generating plots...', 'scanbquartermonthreport-progress'); |
2608 |
28 Aug 14 |
nicklas |
request = Wizard.asyncJsonRequest(url, report.onPlotGenerated); |
2608 |
28 Aug 14 |
nicklas |
128 |
} |
2608 |
28 Aug 14 |
nicklas |
129 |
|
2608 |
28 Aug 14 |
nicklas |
report.onPlotGenerated = function(response) |
2608 |
28 Aug 14 |
nicklas |
131 |
{ |
2608 |
28 Aug 14 |
nicklas |
request = null; |
2608 |
28 Aug 14 |
nicklas |
133 |
|
2608 |
28 Aug 14 |
nicklas |
var plotReport = response.report; |
2608 |
28 Aug 14 |
nicklas |
var reportDiv = Doc.element('reportdiv'); |
2608 |
28 Aug 14 |
nicklas |
136 |
|
2608 |
28 Aug 14 |
nicklas |
var plots = plotReport.plotStatistics; |
2608 |
28 Aug 14 |
nicklas |
// Draw plots |
2608 |
28 Aug 14 |
nicklas |
for (var plotNo = 0; plotNo < plots.length; plotNo++) |
2608 |
28 Aug 14 |
nicklas |
140 |
{ |
2608 |
28 Aug 14 |
nicklas |
// Get plot JSON data container with extra info and plot data |
2608 |
28 Aug 14 |
nicklas |
var plot = plots[plotNo]; |
2608 |
28 Aug 14 |
nicklas |
143 |
|
2608 |
28 Aug 14 |
nicklas |
// Get plot JSON extra info and plot data |
2608 |
28 Aug 14 |
nicklas |
var plotChartVariant = plot.chartVariant; |
2608 |
28 Aug 14 |
nicklas |
var plotViewType = plot.viewType; |
2608 |
28 Aug 14 |
nicklas |
var plotOptionalHeadline = plot.optionalHeadline; |
2608 |
28 Aug 14 |
nicklas |
var boxPlotJsonData = plot.plotData; |
2608 |
28 Aug 14 |
nicklas |
149 |
|
2608 |
28 Aug 14 |
nicklas |
// Create plot from plot JSON data |
2608 |
28 Aug 14 |
nicklas |
if (plotOptionalHeadline != null && plotOptionalHeadline != '') |
2608 |
28 Aug 14 |
nicklas |
152 |
{ |
2608 |
28 Aug 14 |
nicklas |
// Print optional headline |
2608 |
28 Aug 14 |
nicklas |
var headlineText = document.createElement('text'); |
2608 |
28 Aug 14 |
nicklas |
headlineText.innerHTML = "<BR>" + plotOptionalHeadline + "<BR>"; |
2608 |
28 Aug 14 |
nicklas |
reportDiv.appendChild(headlineText); |
2608 |
28 Aug 14 |
nicklas |
157 |
} |
2608 |
28 Aug 14 |
nicklas |
158 |
|
2608 |
28 Aug 14 |
nicklas |
var plotKey = plotChartVariant + '_' + plotViewType; |
2608 |
28 Aug 14 |
nicklas |
160 |
/* |
2608 |
28 Aug 14 |
nicklas |
// Add plot key as debug text |
2608 |
28 Aug 14 |
nicklas |
var debugText = document.createElement('text'); |
2608 |
28 Aug 14 |
nicklas |
debugText.innerHTML = "<BR>" + plotKey + "<BR>"; |
2608 |
28 Aug 14 |
nicklas |
reportDiv.appendChild(spacer); |
2608 |
28 Aug 14 |
nicklas |
reportDiv.appendChild(debugText); |
2608 |
28 Aug 14 |
nicklas |
166 |
*/ |
2608 |
28 Aug 14 |
nicklas |
// Add plot |
2608 |
28 Aug 14 |
nicklas |
var canvasInTable = document.createElement('canvas'); |
2608 |
28 Aug 14 |
nicklas |
canvasInTable.setAttribute('id', plotKey); |
2608 |
28 Aug 14 |
nicklas |
canvasInTable.setAttribute('width', PLOT_WIDTH * PLOT_SCALE); |
2608 |
28 Aug 14 |
nicklas |
canvasInTable.setAttribute('height', PLOT_HEIGHT * PLOT_SCALE); |
2608 |
28 Aug 14 |
nicklas |
createBoxPlot(boxPlotJsonData, canvasInTable, PLOT_WIDTH, PLOT_HEIGHT, PLOT_SCALE); |
2608 |
28 Aug 14 |
nicklas |
reportDiv.appendChild(canvasInTable); |
2608 |
28 Aug 14 |
nicklas |
canvasInTable.addEventListener('mousemove', report.drawCanvasGuidelines, false); |
2608 |
28 Aug 14 |
nicklas |
canvasInTable.addEventListener('mouseleave', report.hideCanvasGuidelines, false); |
2608 |
28 Aug 14 |
nicklas |
176 |
} |
2608 |
28 Aug 14 |
nicklas |
177 |
|
2608 |
28 Aug 14 |
nicklas |
// Print optional appended info |
2608 |
28 Aug 14 |
nicklas |
var appendedInfo = plotReport.appendedInfo; |
2608 |
28 Aug 14 |
nicklas |
if (appendedInfo != null && appendedInfo != '') |
2608 |
28 Aug 14 |
nicklas |
181 |
{ |
2608 |
28 Aug 14 |
nicklas |
// Print optional headline |
2608 |
28 Aug 14 |
nicklas |
var infoText = document.createElement('text'); |
2608 |
28 Aug 14 |
nicklas |
infoText.innerHTML = "<BR>" + appendedInfo + "<BR>"; |
2608 |
28 Aug 14 |
nicklas |
reportDiv.appendChild(infoText); |
2608 |
28 Aug 14 |
nicklas |
186 |
} |
2608 |
28 Aug 14 |
nicklas |
187 |
|
2608 |
28 Aug 14 |
nicklas |
var caseSummary = reportDiv.getElementsByClassName('case-summary'); |
2608 |
28 Aug 14 |
nicklas |
for (var i = 0; i < caseSummary.length; i++) |
2608 |
28 Aug 14 |
nicklas |
190 |
{ |
2608 |
28 Aug 14 |
nicklas |
var cs = caseSummary[i]; |
5019 |
10 Oct 18 |
nicklas |
Events.addEventHandler(cs, 'click', Reggie.openCaseSummaryPopupOnEvent); |
2608 |
28 Aug 14 |
nicklas |
193 |
} |
2608 |
28 Aug 14 |
nicklas |
194 |
|
2608 |
28 Aug 14 |
nicklas |
Doc.show('step-2'); |
2608 |
28 Aug 14 |
nicklas |
Doc.show('printButton'); |
2608 |
28 Aug 14 |
nicklas |
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 |
report.drawCanvasGuidelines = function(event) |
2608 |
28 Aug 14 |
nicklas |
202 |
{ |
2608 |
28 Aug 14 |
nicklas |
if (!xGuide) |
2608 |
28 Aug 14 |
nicklas |
204 |
{ |
2608 |
28 Aug 14 |
nicklas |
xGuide = Doc.element('x-guide'); |
2608 |
28 Aug 14 |
nicklas |
yGuide = Doc.element('y-guide'); |
2608 |
28 Aug 14 |
nicklas |
207 |
} |
2608 |
28 Aug 14 |
nicklas |
var canvas = event.target; |
2608 |
28 Aug 14 |
nicklas |
var centerX = event.clientX; |
2608 |
28 Aug 14 |
nicklas |
var centerY = event.clientY; |
2608 |
28 Aug 14 |
nicklas |
var canvasPos = Doc.getElementPosition(canvas); |
2608 |
28 Aug 14 |
nicklas |
var startX = canvasPos.left+50; |
2608 |
28 Aug 14 |
nicklas |
var widthX = canvasPos.width-100; |
2608 |
28 Aug 14 |
nicklas |
var startY = canvasPos.top+80; |
2608 |
28 Aug 14 |
nicklas |
var heightY = canvasPos.height-160; |
2608 |
28 Aug 14 |
nicklas |
if (centerY < startY || centerY > startY+heightY) |
2608 |
28 Aug 14 |
nicklas |
217 |
{ |
2608 |
28 Aug 14 |
nicklas |
// Hide when mouse is in the text area below or over the plot |
2608 |
28 Aug 14 |
nicklas |
yGuide.style.display = 'none'; |
2608 |
28 Aug 14 |
nicklas |
220 |
} |
2608 |
28 Aug 14 |
nicklas |
else |
2608 |
28 Aug 14 |
nicklas |
222 |
{ |
2608 |
28 Aug 14 |
nicklas |
yGuide.style.top = (centerY-2) + 'px'; |
2608 |
28 Aug 14 |
nicklas |
yGuide.style.left = startX + 'px'; |
2608 |
28 Aug 14 |
nicklas |
yGuide.style.width = widthX + 'px'; |
2608 |
28 Aug 14 |
nicklas |
yGuide.style.display = 'block'; |
2608 |
28 Aug 14 |
nicklas |
227 |
} |
2608 |
28 Aug 14 |
nicklas |
if (centerX < startX || centerX > startX + widthX) |
2608 |
28 Aug 14 |
nicklas |
229 |
{ |
2608 |
28 Aug 14 |
nicklas |
// Hide when mouse is in the text area to the left or right of the plot |
2608 |
28 Aug 14 |
nicklas |
xGuide.style.display = 'none'; |
2608 |
28 Aug 14 |
nicklas |
232 |
} |
2608 |
28 Aug 14 |
nicklas |
else |
2608 |
28 Aug 14 |
nicklas |
234 |
{ |
2608 |
28 Aug 14 |
nicklas |
// Avoid drawing outside the avilable hight (causes an extra pair of scroll bars) |
2842 |
20 Oct 14 |
nicklas |
var yLimit = App.getWindowPosition().height; |
2608 |
28 Aug 14 |
nicklas |
if (startY+heightY > yLimit) |
2608 |
28 Aug 14 |
nicklas |
238 |
{ |
2608 |
28 Aug 14 |
nicklas |
heightY = yLimit-startY; |
2608 |
28 Aug 14 |
nicklas |
240 |
} |
2608 |
28 Aug 14 |
nicklas |
xGuide.style.top = startY + 'px'; |
2608 |
28 Aug 14 |
nicklas |
xGuide.style.left = (centerX-2) + 'px'; |
2608 |
28 Aug 14 |
nicklas |
xGuide.style.height = heightY + 'px'; |
2608 |
28 Aug 14 |
nicklas |
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 |
report.hideCanvasGuidelines = function() |
2608 |
28 Aug 14 |
nicklas |
250 |
{ |
2608 |
28 Aug 14 |
nicklas |
xGuide.style.display = 'none'; |
2608 |
28 Aug 14 |
nicklas |
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 |
report.printVersion = function() |
2608 |
28 Aug 14 |
nicklas |
257 |
{ |
2608 |
28 Aug 14 |
nicklas |
var printNote = '<b>Note!</b> For better printing set page orientation to <i>portrait</i>.'; |
2608 |
28 Aug 14 |
nicklas |
printNote += ' Scale down to <i>90%</i> to fit 2 plots per page.'; |
2608 |
28 Aug 14 |
nicklas |
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 |
return report; |
2608 |
28 Aug 14 |
nicklas |
264 |
}(); |
2608 |
28 Aug 14 |
nicklas |
265 |
|
2608 |
28 Aug 14 |
nicklas |
Doc.onLoad(Report.initPage); |