3505 |
23 Sep 15 |
olle |
var Report = function() |
3505 |
23 Sep 15 |
olle |
2 |
{ |
3505 |
23 Sep 15 |
olle |
var report = {}; |
3505 |
23 Sep 15 |
olle |
var debug = 0; |
3505 |
23 Sep 15 |
olle |
5 |
|
3505 |
23 Sep 15 |
olle |
var PLOT_WIDTH = 700; |
3505 |
23 Sep 15 |
olle |
var PLOT_HEIGHT = 550; |
3505 |
23 Sep 15 |
olle |
var PLOT_SCALE = 2; |
3505 |
23 Sep 15 |
olle |
9 |
|
3505 |
23 Sep 15 |
olle |
var periodIsValid = true; |
4175 |
24 Oct 16 |
olle |
report.TITLE = 'MeLuDI'; |
6805 |
24 Aug 22 |
olle |
report.VERSION = '1.6.0'; |
3505 |
23 Sep 15 |
olle |
var xGuide; |
3505 |
23 Sep 15 |
olle |
var yGuide; |
3505 |
23 Sep 15 |
olle |
15 |
|
3505 |
23 Sep 15 |
olle |
report.initPage = function() |
3505 |
23 Sep 15 |
olle |
17 |
{ |
3505 |
23 Sep 15 |
olle |
var frm = document.forms['meludi']; |
3505 |
23 Sep 15 |
olle |
19 |
|
3505 |
23 Sep 15 |
olle |
// Step 1 |
3505 |
23 Sep 15 |
olle |
Events.addEventHandler('fromdate', 'blur', report.dateOnChange) |
3505 |
23 Sep 15 |
olle |
Events.addEventHandler('todate', 'blur', report.dateOnChange) |
3505 |
23 Sep 15 |
olle |
Events.addEventHandler('step-1', 'wizard-validate', report.validateStep1); |
3505 |
23 Sep 15 |
olle |
24 |
|
3505 |
23 Sep 15 |
olle |
// Step 2 |
3505 |
23 Sep 15 |
olle |
Events.addEventHandler('printButton', 'click', report.printVersion); |
3505 |
23 Sep 15 |
olle |
27 |
|
3505 |
23 Sep 15 |
olle |
// Navigation |
3505 |
23 Sep 15 |
olle |
Buttons.addClickHandler('gocancel', Wizard.cancelWizard); |
3505 |
23 Sep 15 |
olle |
Buttons.addClickHandler('gorestart', Wizard.restartWizard); |
3505 |
23 Sep 15 |
olle |
Buttons.addClickHandler('gonext', Wizard.goNextOnClick); |
3505 |
23 Sep 15 |
olle |
Buttons.addClickHandler('gocreate', Wizard.goRegister); |
3505 |
23 Sep 15 |
olle |
33 |
|
3505 |
23 Sep 15 |
olle |
// Final registration |
3505 |
23 Sep 15 |
olle |
Events.addEventHandler('wizard', 'wizard-submit', report.submit); |
3505 |
23 Sep 15 |
olle |
36 |
|
3505 |
23 Sep 15 |
olle |
Doc.show('step-1'); |
3505 |
23 Sep 15 |
olle |
Doc.show('gocreate'); |
3505 |
23 Sep 15 |
olle |
frm.fromdate.focus(); |
3505 |
23 Sep 15 |
olle |
40 |
|
3505 |
23 Sep 15 |
olle |
// Load sites |
3505 |
23 Sep 15 |
olle |
var url = '../MeludiQuarterMonthReport.servlet?ID='+App.getSessionId(); |
3505 |
23 Sep 15 |
olle |
url += '&cmd=GetSites'; |
3505 |
23 Sep 15 |
olle |
Doc.addClass('sites', 'list-loading'); |
3505 |
23 Sep 15 |
olle |
frm.sites[0] = new Option('loading...'); |
3505 |
23 Sep 15 |
olle |
Wizard.asyncJsonRequest(url, report.sitesLoaded); |
3505 |
23 Sep 15 |
olle |
47 |
} |
3505 |
23 Sep 15 |
olle |
48 |
|
3505 |
23 Sep 15 |
olle |
49 |
|
3505 |
23 Sep 15 |
olle |
report.sitesLoaded = function(response) |
3505 |
23 Sep 15 |
olle |
51 |
{ |
3505 |
23 Sep 15 |
olle |
Doc.removeClass('sites', 'list-loading'); |
3505 |
23 Sep 15 |
olle |
var frm = document.forms['meludi']; |
3505 |
23 Sep 15 |
olle |
var sites = response.sites; |
3505 |
23 Sep 15 |
olle |
frm.sites.length = 0; |
3505 |
23 Sep 15 |
olle |
frm.sites[0] = new Option('All sites together', ''); |
3505 |
23 Sep 15 |
olle |
for (var i = 0; i < sites.length; i++) |
3505 |
23 Sep 15 |
olle |
58 |
{ |
3505 |
23 Sep 15 |
olle |
var s = sites[i]; |
3505 |
23 Sep 15 |
olle |
var option = new Option(s.name, s.prefix); |
3505 |
23 Sep 15 |
olle |
frm.sites[frm.sites.length] = option; |
3505 |
23 Sep 15 |
olle |
62 |
} |
3505 |
23 Sep 15 |
olle |
63 |
} |
3505 |
23 Sep 15 |
olle |
64 |
|
3505 |
23 Sep 15 |
olle |
report.dateOnChange = function() |
3505 |
23 Sep 15 |
olle |
66 |
{ |
3505 |
23 Sep 15 |
olle |
var frm = document.forms['meludi']; |
3505 |
23 Sep 15 |
olle |
var fromDate = frm.fromdate.value; |
3505 |
23 Sep 15 |
olle |
var toDate = frm.todate.value; |
3505 |
23 Sep 15 |
olle |
70 |
|
3505 |
23 Sep 15 |
olle |
periodIsValid = false; |
3505 |
23 Sep 15 |
olle |
Wizard.setInputStatus('period'); |
3505 |
23 Sep 15 |
olle |
73 |
|
3505 |
23 Sep 15 |
olle |
if (fromDate != '') |
3505 |
23 Sep 15 |
olle |
75 |
{ |
3505 |
23 Sep 15 |
olle |
fromDate = Meludi.autoFillDate(fromDate, true); |
3505 |
23 Sep 15 |
olle |
frm.fromdate.value = fromDate; |
3505 |
23 Sep 15 |
olle |
if (!Dates.isDate(fromDate, 'yyyyMMdd')) |
3505 |
23 Sep 15 |
olle |
79 |
{ |
3505 |
23 Sep 15 |
olle |
Wizard.setInputStatus('period', 'invalid', 'Not a valid from-date'); |
3505 |
23 Sep 15 |
olle |
return; |
3505 |
23 Sep 15 |
olle |
82 |
} |
3505 |
23 Sep 15 |
olle |
83 |
} |
3505 |
23 Sep 15 |
olle |
84 |
|
3505 |
23 Sep 15 |
olle |
if (toDate != '') |
3505 |
23 Sep 15 |
olle |
86 |
{ |
3505 |
23 Sep 15 |
olle |
toDate = Meludi.autoFillDate(toDate, true); |
3505 |
23 Sep 15 |
olle |
frm.todate.value = toDate; |
3505 |
23 Sep 15 |
olle |
if (!Dates.isDate(toDate, 'yyyyMMdd')) |
3505 |
23 Sep 15 |
olle |
90 |
{ |
3505 |
23 Sep 15 |
olle |
Wizard.setInputStatus('period', 'invalid', 'Not a valid to-date'); |
3505 |
23 Sep 15 |
olle |
return; |
3505 |
23 Sep 15 |
olle |
93 |
} |
3505 |
23 Sep 15 |
olle |
94 |
} |
3505 |
23 Sep 15 |
olle |
95 |
|
3505 |
23 Sep 15 |
olle |
if (toDate && fromDate) |
3505 |
23 Sep 15 |
olle |
97 |
{ |
3505 |
23 Sep 15 |
olle |
if (fromDate > toDate) |
3505 |
23 Sep 15 |
olle |
99 |
{ |
3505 |
23 Sep 15 |
olle |
Wizard.setInputStatus('period', 'invalid', 'Invalid period') |
3505 |
23 Sep 15 |
olle |
return; |
3505 |
23 Sep 15 |
olle |
102 |
} |
3505 |
23 Sep 15 |
olle |
103 |
} |
3505 |
23 Sep 15 |
olle |
104 |
|
3505 |
23 Sep 15 |
olle |
Wizard.setInputStatus('period', 'valid'); |
3505 |
23 Sep 15 |
olle |
periodIsValid = true; |
3505 |
23 Sep 15 |
olle |
107 |
} |
3505 |
23 Sep 15 |
olle |
108 |
|
3505 |
23 Sep 15 |
olle |
109 |
|
3505 |
23 Sep 15 |
olle |
report.validateStep1 = function(event) |
3505 |
23 Sep 15 |
olle |
111 |
{ |
3505 |
23 Sep 15 |
olle |
if (!periodIsValid) event.preventDefault(); |
3505 |
23 Sep 15 |
olle |
113 |
} |
3505 |
23 Sep 15 |
olle |
114 |
|
3505 |
23 Sep 15 |
olle |
115 |
|
3505 |
23 Sep 15 |
olle |
report.submit = function(event) |
3505 |
23 Sep 15 |
olle |
117 |
{ |
3505 |
23 Sep 15 |
olle |
var frm = document.forms['meludi']; |
3505 |
23 Sep 15 |
olle |
119 |
|
3505 |
23 Sep 15 |
olle |
var url = '../MeludiQuarterMonthReport.servlet?ID='+App.getSessionId(); |
3505 |
23 Sep 15 |
olle |
url += '&cmd=meludiquartermonthreport'; |
3505 |
23 Sep 15 |
olle |
url += '&fdate='+encodeURIComponent(frm.fromdate.value); |
3505 |
23 Sep 15 |
olle |
url += '&tdate='+encodeURIComponent(frm.todate.value); |
3505 |
23 Sep 15 |
olle |
url += '&vtype='+encodeURIComponent(frm.viewtype.value); |
3515 |
29 Sep 15 |
olle |
url += '&extractsourcefilter='+encodeURIComponent(frm.extractsourcefilter.value); |
3505 |
23 Sep 15 |
olle |
url += '&projectfocusfilter='+encodeURIComponent(frm.projectfocusfilter.value); |
3505 |
23 Sep 15 |
olle |
url += '&site='+encodeURIComponent(frm.sites.value); |
3505 |
23 Sep 15 |
olle |
url += '&cvariant='+encodeURIComponent(frm.chartvariant.value); |
3505 |
23 Sep 15 |
olle |
129 |
|
3505 |
23 Sep 15 |
olle |
Wizard.showLoadingAnimation('Generating plots...'); |
3505 |
23 Sep 15 |
olle |
request = Wizard.asyncJsonRequest(url, report.onPlotGenerated); |
3505 |
23 Sep 15 |
olle |
132 |
} |
3505 |
23 Sep 15 |
olle |
133 |
|
3505 |
23 Sep 15 |
olle |
report.onPlotGenerated = function(response) |
3505 |
23 Sep 15 |
olle |
135 |
{ |
3505 |
23 Sep 15 |
olle |
request = null; |
3505 |
23 Sep 15 |
olle |
var frm = document.forms['meludi']; |
3505 |
23 Sep 15 |
olle |
138 |
|
3505 |
23 Sep 15 |
olle |
var plotReport = response.report; |
4175 |
24 Oct 16 |
olle |
var projectName = plotReport.projectName; |
3505 |
23 Sep 15 |
olle |
var reportTable; |
3505 |
23 Sep 15 |
olle |
var reportDiv = Doc.element('reportdiv'); |
3505 |
23 Sep 15 |
olle |
143 |
|
3505 |
23 Sep 15 |
olle |
var plots = plotReport.plotStatistics; |
3505 |
23 Sep 15 |
olle |
// Draw plots |
3505 |
23 Sep 15 |
olle |
for (var plotNo = 0; plotNo < plots.length; plotNo++) |
3505 |
23 Sep 15 |
olle |
147 |
{ |
3505 |
23 Sep 15 |
olle |
// Get plot JSON data container with extra info and plot data |
3505 |
23 Sep 15 |
olle |
var plot = plots[plotNo]; |
3505 |
23 Sep 15 |
olle |
150 |
|
3505 |
23 Sep 15 |
olle |
// Get plot JSON extra info and plot data |
3505 |
23 Sep 15 |
olle |
var plotChartVariant = plot.chartVariant; |
3505 |
23 Sep 15 |
olle |
var plotViewType = plot.viewType; |
3505 |
23 Sep 15 |
olle |
var plotOptionalHeadline = plot.optionalHeadline; |
3505 |
23 Sep 15 |
olle |
var boxPlotJsonData = plot.plotData; |
3505 |
23 Sep 15 |
olle |
156 |
|
3505 |
23 Sep 15 |
olle |
// Create plot from plot JSON data |
4175 |
24 Oct 16 |
olle |
var headlineText = document.createElement('text'); |
4175 |
24 Oct 16 |
olle |
headlineText.innerHTML = "<BR><H2>" + projectName + " [" + Report.TITLE + " " + Report.VERSION + "]</H2><BR>"; |
3505 |
23 Sep 15 |
olle |
if (plotOptionalHeadline != null && plotOptionalHeadline != '') |
3505 |
23 Sep 15 |
olle |
161 |
{ |
3505 |
23 Sep 15 |
olle |
// Print optional headline |
4175 |
24 Oct 16 |
olle |
//var headlineText = document.createElement('text'); |
4175 |
24 Oct 16 |
olle |
headlineText.innerHTML += "<BR>" + plotOptionalHeadline + "<BR>"; |
4175 |
24 Oct 16 |
olle |
//reportDiv.appendChild(headlineText); |
3505 |
23 Sep 15 |
olle |
166 |
} |
4175 |
24 Oct 16 |
olle |
reportDiv.appendChild(headlineText); |
3505 |
23 Sep 15 |
olle |
168 |
|
3505 |
23 Sep 15 |
olle |
var plotKey = plotChartVariant + '_' + plotViewType; |
3505 |
23 Sep 15 |
olle |
170 |
/* |
3505 |
23 Sep 15 |
olle |
// Add plot key as debug text |
3505 |
23 Sep 15 |
olle |
var debugText = document.createElement('text'); |
3505 |
23 Sep 15 |
olle |
debugText.innerHTML = "<BR>" + plotKey + "<BR>"; |
3505 |
23 Sep 15 |
olle |
reportDiv.appendChild(spacer); |
3505 |
23 Sep 15 |
olle |
reportDiv.appendChild(debugText); |
3505 |
23 Sep 15 |
olle |
176 |
*/ |
3505 |
23 Sep 15 |
olle |
// Add plot |
3505 |
23 Sep 15 |
olle |
var canvasInTable = document.createElement('canvas'); |
3505 |
23 Sep 15 |
olle |
canvasInTable.setAttribute('id', plotKey); |
3505 |
23 Sep 15 |
olle |
canvasInTable.setAttribute('width', PLOT_WIDTH * PLOT_SCALE); |
3505 |
23 Sep 15 |
olle |
canvasInTable.setAttribute('height', PLOT_HEIGHT * PLOT_SCALE); |
3505 |
23 Sep 15 |
olle |
createBoxPlot(boxPlotJsonData, canvasInTable, PLOT_WIDTH, PLOT_HEIGHT, PLOT_SCALE); |
3505 |
23 Sep 15 |
olle |
reportDiv.appendChild(canvasInTable); |
3505 |
23 Sep 15 |
olle |
canvasInTable.addEventListener('mousemove', report.drawCanvasGuidelines, false); |
3505 |
23 Sep 15 |
olle |
canvasInTable.addEventListener('mouseleave', report.hideCanvasGuidelines, false); |
3505 |
23 Sep 15 |
olle |
186 |
} |
3505 |
23 Sep 15 |
olle |
187 |
|
3505 |
23 Sep 15 |
olle |
// Print optional appended info |
3505 |
23 Sep 15 |
olle |
var appendedInfo = plotReport.appendedInfo; |
3505 |
23 Sep 15 |
olle |
if (appendedInfo != null && appendedInfo != '') |
3505 |
23 Sep 15 |
olle |
191 |
{ |
3505 |
23 Sep 15 |
olle |
// Print optional headline |
3505 |
23 Sep 15 |
olle |
var infoText = document.createElement('text'); |
3505 |
23 Sep 15 |
olle |
infoText.innerHTML = "<BR>" + appendedInfo + "<BR>"; |
3505 |
23 Sep 15 |
olle |
reportDiv.appendChild(infoText); |
3505 |
23 Sep 15 |
olle |
196 |
} |
3505 |
23 Sep 15 |
olle |
197 |
|
3505 |
23 Sep 15 |
olle |
var caseSummary = reportDiv.getElementsByClassName('case-summary'); |
3505 |
23 Sep 15 |
olle |
for (var i = 0; i < caseSummary.length; i++) |
3505 |
23 Sep 15 |
olle |
200 |
{ |
3505 |
23 Sep 15 |
olle |
var cs = caseSummary[i]; |
3505 |
23 Sep 15 |
olle |
Events.addEventHandler(cs, 'click', report.showCaseSummary); |
3505 |
23 Sep 15 |
olle |
203 |
} |
3505 |
23 Sep 15 |
olle |
204 |
|
3505 |
23 Sep 15 |
olle |
Doc.show('step-2'); |
3505 |
23 Sep 15 |
olle |
Doc.show('printButton'); |
3505 |
23 Sep 15 |
olle |
Doc.show('gorestart'); |
3505 |
23 Sep 15 |
olle |
208 |
|
3505 |
23 Sep 15 |
olle |
209 |
} |
3505 |
23 Sep 15 |
olle |
210 |
|
3505 |
23 Sep 15 |
olle |
report.drawCanvasGuidelines = function(event) |
3505 |
23 Sep 15 |
olle |
212 |
{ |
3505 |
23 Sep 15 |
olle |
if (!xGuide) |
3505 |
23 Sep 15 |
olle |
214 |
{ |
3505 |
23 Sep 15 |
olle |
xGuide = Doc.element('x-guide'); |
3505 |
23 Sep 15 |
olle |
yGuide = Doc.element('y-guide'); |
3505 |
23 Sep 15 |
olle |
217 |
} |
3505 |
23 Sep 15 |
olle |
var canvas = event.target; |
3505 |
23 Sep 15 |
olle |
var centerX = event.clientX; |
3505 |
23 Sep 15 |
olle |
var centerY = event.clientY; |
3505 |
23 Sep 15 |
olle |
var canvasPos = Doc.getElementPosition(canvas); |
3505 |
23 Sep 15 |
olle |
var startX = canvasPos.left+50; |
3505 |
23 Sep 15 |
olle |
var widthX = canvasPos.width-100; |
3505 |
23 Sep 15 |
olle |
var startY = canvasPos.top+80; |
3505 |
23 Sep 15 |
olle |
var heightY = canvasPos.height-160; |
3505 |
23 Sep 15 |
olle |
if (centerY < startY || centerY > startY+heightY) |
3505 |
23 Sep 15 |
olle |
227 |
{ |
3505 |
23 Sep 15 |
olle |
// Hide when mouse is in the text area below or over the plot |
3505 |
23 Sep 15 |
olle |
yGuide.style.display = 'none'; |
3505 |
23 Sep 15 |
olle |
230 |
} |
3505 |
23 Sep 15 |
olle |
else |
3505 |
23 Sep 15 |
olle |
232 |
{ |
3505 |
23 Sep 15 |
olle |
yGuide.style.top = (centerY-2) + 'px'; |
3505 |
23 Sep 15 |
olle |
yGuide.style.left = startX + 'px'; |
3505 |
23 Sep 15 |
olle |
yGuide.style.width = widthX + 'px'; |
3505 |
23 Sep 15 |
olle |
yGuide.style.display = 'block'; |
3505 |
23 Sep 15 |
olle |
237 |
} |
3505 |
23 Sep 15 |
olle |
if (centerX < startX || centerX > startX + widthX) |
3505 |
23 Sep 15 |
olle |
239 |
{ |
3505 |
23 Sep 15 |
olle |
// Hide when mouse is in the text area to the left or right of the plot |
3505 |
23 Sep 15 |
olle |
xGuide.style.display = 'none'; |
3505 |
23 Sep 15 |
olle |
242 |
} |
3505 |
23 Sep 15 |
olle |
else |
3505 |
23 Sep 15 |
olle |
244 |
{ |
3505 |
23 Sep 15 |
olle |
// Avoid drawing outside the avilable hight (causes an extra pair of scroll bars) |
3505 |
23 Sep 15 |
olle |
var yLimit = App.getWindowPosition().height; |
3505 |
23 Sep 15 |
olle |
if (startY+heightY > yLimit) |
3505 |
23 Sep 15 |
olle |
248 |
{ |
3505 |
23 Sep 15 |
olle |
heightY = yLimit-startY; |
3505 |
23 Sep 15 |
olle |
250 |
} |
3505 |
23 Sep 15 |
olle |
xGuide.style.top = startY + 'px'; |
3505 |
23 Sep 15 |
olle |
xGuide.style.left = (centerX-2) + 'px'; |
3505 |
23 Sep 15 |
olle |
xGuide.style.height = heightY + 'px'; |
3505 |
23 Sep 15 |
olle |
xGuide.style.display = 'block'; |
3505 |
23 Sep 15 |
olle |
255 |
} |
3505 |
23 Sep 15 |
olle |
256 |
|
3505 |
23 Sep 15 |
olle |
257 |
} |
3505 |
23 Sep 15 |
olle |
258 |
|
3505 |
23 Sep 15 |
olle |
report.hideCanvasGuidelines = function(event) |
3505 |
23 Sep 15 |
olle |
260 |
{ |
3505 |
23 Sep 15 |
olle |
xGuide.style.display = 'none'; |
3505 |
23 Sep 15 |
olle |
yGuide.style.display = 'none'; |
3505 |
23 Sep 15 |
olle |
263 |
} |
3505 |
23 Sep 15 |
olle |
264 |
|
3505 |
23 Sep 15 |
olle |
265 |
|
3505 |
23 Sep 15 |
olle |
report.printVersion = function() |
3505 |
23 Sep 15 |
olle |
267 |
{ |
3505 |
23 Sep 15 |
olle |
var printNote = '<b>Note!</b> For better printing set page orientation to <i>portrait</i>.'; |
3505 |
23 Sep 15 |
olle |
printNote += ' Scale down to <i>90%</i> to fit 2 plots per page.'; |
3505 |
23 Sep 15 |
olle |
Meludi.openPrintWindow('step-2-content', 'Sample processing statistics', 'portrait', printNote, '../', 'report.css'); |
3505 |
23 Sep 15 |
olle |
271 |
} |
3505 |
23 Sep 15 |
olle |
272 |
|
3505 |
23 Sep 15 |
olle |
report.showCaseSummary = function(event) |
3505 |
23 Sep 15 |
olle |
274 |
{ |
3505 |
23 Sep 15 |
olle |
var caseName = Data.get(event.currentTarget, 'case-name'); |
3505 |
23 Sep 15 |
olle |
if (caseName) |
3505 |
23 Sep 15 |
olle |
277 |
{ |
3505 |
23 Sep 15 |
olle |
var url = 'case_summary.jsp?ID='+App.getSessionId(); |
3505 |
23 Sep 15 |
olle |
url += '&caseName='+encodeURIComponent(caseName); |
3505 |
23 Sep 15 |
olle |
url += '&pageType=popup'; |
3505 |
23 Sep 15 |
olle |
Dialogs.openPopup(url, 'CaseSummary', 1000, 700); |
3505 |
23 Sep 15 |
olle |
282 |
} |
3505 |
23 Sep 15 |
olle |
283 |
} |
3505 |
23 Sep 15 |
olle |
284 |
|
3505 |
23 Sep 15 |
olle |
return report; |
3505 |
23 Sep 15 |
olle |
286 |
}(); |
3505 |
23 Sep 15 |
olle |
287 |
|
3505 |
23 Sep 15 |
olle |
Doc.onLoad(Report.initPage); |