source: extensions/net.sf.basedb.labenv/trunk/resources/reports/labenvironmentdatabasedisplay.jsp @ 2465

Last change on this file since 2465 was 2465, checked in by olle, 9 years ago

Refs #592. Lab environment extension updated for weekly and overview display reports:

  1. Both weekly and overview display updated to support day-time and week day filters, since filtering of the data affects the calculated statistical values shown in and beside the graphs. Currently the overview display supports a day-time filter.
  1. Overview display report day markers updated for 31 - 366 days to show markers for Mondays, since it is advantageous for the interpretation of the graph to know when a new week starts.

Implementation:

  1. JSP file labenvironmentdatabasedisplay.jsp in resources/reports/ updated:
    a. Function gotoStep2() updated to display day-time filter input fields and week day selection menu for weekly and overview display reports.
    b. Function goCreate() updated to send input data for day-time and week day filters in Ajax request to LabEnvironmentDisplayServlet.
    c. HTML section updated with week day selection menu.
  2. Class/file LabEnvironmentDisplayServlet.java in src/net/sf/basedb/labenv/servlet/ updated:
    a. Protected method doGet(HttpServletRequest req, HttpServletResponse resp) updated to apply optional day-time and week day filters for weekly and overview display reports.
    b. Private method JSONObject createJsonOverviewPlot(String chartVariant, List<LabEnvironmentData> lthdList, Date startDate, Date endDate, String viewType, String chartSite, String variableType, String weekdayFilter, String daytimeFilterFromTime, String daytimeFilterToTime) updated for 31 - 366 days to show markers for Mondays.
File size: 32.9 KB
Line 
1<%@ page
2  pageEncoding="UTF-8"
3  session="false"
4  import="net.sf.basedb.core.User"
5  import="net.sf.basedb.core.DbControl"
6  import="net.sf.basedb.core.SessionControl"
7  import="net.sf.basedb.core.Application"
8  import="net.sf.basedb.clients.web.Base" 
9  import="net.sf.basedb.clients.web.extensions.ExtensionsControl"
10%>
11<%@ taglib prefix="base" uri="/WEB-INF/base.tld" %>
12<%@ taglib prefix="p" uri="/WEB-INF/path.tld" %>
13<%
14final SessionControl sc = Base.getExistingSessionControl(request, true);
15final String ID = sc.getId();
16final float scale = Base.getScale(sc);
17final String home = ExtensionsControl.getHomeUrl("net.sf.basedb.labenv");
18DbControl dc = null;
19try
20{
21  dc = sc.newDbControl();
22  final User user = User.getById(dc, sc.getLoggedInUserId());
23  %>
24<base:page type="default" >
25<base:head scripts="ajax.js" styles="path.css">
26  <link rel="stylesheet" type="text/css" href="../css/reggie.css">
27  <script language="JavaScript" src="../reggie.js" type="text/javascript" charset="UTF-8"></script>
28  <script language="JavaScript" src="boxplot.js" type="text/javascript" charset="UTF-8"></script>
29   
30   
31  <script language="JavaScript">
32  var currentStep = 1;
33  var debug = false;
34/*
35  var numCols;
36  var unknownSite = 0;
37  var unknownCreation;
38  var numPatientsNoSamples = 0;
39  var debug01 = null;
40*/
41 
42  window.onload = function()
43  {
44    // Create lab sensor menu from configuration data
45    createSensorMenu();
46  };
47
48  function createSensorMenu()
49  {
50    // Get lab sensor configurations dynamically from server data
51    var frm = document.forms['labenv'];
52    var labSensorConfigList = getLabSensorConfigList();
53    if (labSensorConfigList != null)
54    {
55      // Construct lab sensor menu from JSON data
56      var sensorSelect = document.getElementById('sensorSelectId');
57      for (var i=0; i < labSensorConfigList.length; i++)
58      {
59        // Get URL and name for lab sensor number 'i'
60        var labSensorConfig = labSensorConfigList[i];
61        var sensorUrl = labSensorConfig['url'];
62        var sensorName = labSensorConfig['name'];
63        // Create and add new option element to select menu
64        var optionEl = document.createElement('option');
65        optionEl.setAttribute('value',sensorUrl);
66        optionEl.innerHTML = sensorName;
67        sensorSelect.appendChild(optionEl);
68      }
69    }
70  }
71
72  function getLabSensorConfigList()
73  {
74    // Get lab sensor configurations JSON object with AJAX
75    var frm = document.forms['labenv'];
76    var request = Ajax.getXmlHttpRequest();
77    var url = '../../labenv.jar/LabEnvironment.servlet?ID=<%=ID%>&cmd=GetLabSensorConfigList';
78    request.open("GET", url, false); 
79    request.send(null);
80 
81    //if (debug) Main.debug(request.responseText);
82    //Main.debug(request.responseText);
83
84    var response = JSON.parse(request.responseText);
85    if (response.status != 'ok')
86    {
87      setFatalError(response.message);
88      return false;
89    }
90 
91    // Get sensor configurations information from the AJAX response
92    var labSensorConfigList = response.labSensorConfigList;
93
94    return labSensorConfigList;
95  }
96
97  function getStorageIntervalInSeconds()
98  {
99    var storageIntervalInSeconds = 0;
100    var labEnvDatabaseConfig = getLabEnvDatabaseConfig();
101    if (labEnvDatabaseConfig != null)
102    {
103      storageIntervalInSeconds = labEnvDatabaseConfig.storageIntervalInSeconds;
104    }
105    return storageIntervalInSeconds;
106  }
107
108  function getLabEnvDatabaseConfig()
109  {
110    // Get lab environment database configuration JSON object with AJAX
111    var frm = document.forms['labenv'];
112    var request = Ajax.getXmlHttpRequest();
113    var url = '../../labenv.jar/LabEnvironment.servlet?ID=<%=ID%>&cmd=GetLabEnvDatabaseConfig';
114    request.open("GET", url, false); 
115    request.send(null);
116 
117    //if (debug) Main.debug(request.responseText);
118    //Main.debug(request.responseText);
119
120    var response = JSON.parse(request.responseText);
121    if (response.status != 'ok')
122    {
123      setFatalError(response.message);
124      return false;
125    }
126 
127    // Get lab environment database configuration information from the AJAX response
128    var labEnvDatabaseConfig = response.labEnvDatabaseConfig;
129
130    return labEnvDatabaseConfig;
131  }
132
133  function fromDateTimeOnChange()
134  {
135    var frm = document.forms['labenv'];
136    var todaysDate = new Date();
137    fromDateIsValid = false;
138    setInputStatus('fromdate', '', '');
139 
140    var fromDate = frm.fromdate.value;
141/*
142    var fromTime = frm.fromtime.value;
143*/
144    var fromTime = '0000';
145 
146    if (fromDate != '' || fromTime != '')
147    {
148      // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
149      fromDate = autoFillDate(fromDate);
150      frm.fromdate.value = fromDate;
151
152/*
153      fromTime = autoFillTime(fromTime);
154      frm.fromtime.value = fromTime;
155*/
156      if (!Dates.isDate(fromDate, 'yyyyMMdd'))
157      {
158        setInputStatus('fromdate', 'Not a valid date', 'invalid');
159        return;
160      }   
161   
162      if (!Dates.isDate(fromDate + ' ' + fromTime, 'yyyyMMdd HHmm'))
163      {
164        if (fromDate != '') setInputStatus('fromdate', 'Not a valid time (if time unknown, also leave date field blank)', 'invalid');
165        return;
166      }
167      setInputStatus('fromdate', '', 'valid');
168    }
169    fromDateIsValid = true;
170/*
171    toDateTimeOnChange();
172*/
173    alert("fromDateTimeOnChange(): fromDate = " + fromDate);
174  }
175
176/*
177  function toDateTimeOnChange()
178  {
179    var frm = document.forms['labenv'];
180    var todaysDate = new Date();
181    toDateIsValid = false;
182    setInputStatus('todate', '', '');
183 
184    var toDate = frm.todate.value;
185    var toTime = frm.totime.value;
186 
187    if (toDate != '' || toTime != '')
188    {
189      // Auto-fill the date if it's only given with 4(MMdd) or 6(yyMMdd) digits.
190      toDate = autoFillDate(toDate);
191      frm.todate.value = toDate;
192
193      toTime = autoFillTime(toTime);
194      frm.totime.value = toTime;
195   
196      if (!Dates.isDate(toDate, 'yyyyMMdd'))
197      {
198        setInputStatus('todate', 'Not a valid date', 'invalid');
199        return;
200      }   
201   
202      if (!Dates.isDate(toDate + ' ' + toTime, 'yyyyMMdd HHmm'))
203      {
204        if (toDate != '') setInputStatus('todate', 'Not a valid time (if time unknown, also leave date field blank)', 'invalid');
205        return;
206      }
207      setInputStatus('todate', '', 'valid');
208    }
209    toDateIsValid = true;
210  }
211*/
212  var intervalIsValid = true;
213 
214  function goNext()
215  {
216    if (currentStep == 1)
217    {
218      gotoStep2();
219    }
220  }
221/* 
222  function getSites()
223  {
224    // Get sites JSON object with AJAX
225    var frm = document.forms['labenv'];
226    var request = Ajax.getXmlHttpRequest();
227    var url = '../LabEnvironment.servlet?ID=<%=ID%>&cmd=getsites';   
228    request.open("GET", url, false); 
229    request.send(null);
230 
231    if (debug) Main.debug(request.responseText);
232
233    var response = JSON.parse(request.responseText);
234    if (response.status != 'ok')
235    {
236      setFatalError(response.message);
237      return false;
238    }
239 
240    // Get site information from the AJAX response
241    var sitesList = response.sitesList;
242
243    return sitesList;
244  }
245*/
246
247  function gotoStep2()
248  {
249    var frm = document.forms['labenv'];
250    frm.reporttype.disabled = true;
251    // Hide report period input fields
252    document.getElementById("reportPeriodSubSection01").style.display = 'none';
253    document.getElementById("reportPeriodSubSection02").style.display = 'none';
254    document.getElementById("reportPeriodSubSection04").style.display = 'none';
255/*
256    // Hide view type pop-up menu
257    document.getElementById("viewTypeSubSection01").style.display = 'none';
258    document.getElementById("viewTypeSubSection02").style.display = 'none';
259    document.getElementById("viewTypeSubSection04").style.display = 'none';
260*/
261    // Hide day-time filter input fields
262    document.getElementById("dayTimeFilterSubSection01").style.display = 'none';
263    document.getElementById("dayTimeFilterSubSection02").style.display = 'none';
264    document.getElementById("dayTimeFilterSubSection04").style.display = 'none';
265    // Hide weekday filter pop-up menu
266    document.getElementById("weekDayFilterSubSection01").style.display = 'none';
267    document.getElementById("weekDayFilterSubSection02").style.display = 'none';
268    document.getElementById("weekDayFilterSubSection04").style.display = 'none';
269    // Hide chart variant pop-up menu
270    document.getElementById("chartVariantSubSection01").style.display = 'none';
271    document.getElementById("chartVariantSubSection02").style.display = 'none';
272    document.getElementById("chartVariantSubSection04").style.display = 'none';
273    if (frm.reporttype[frm.reporttype.selectedIndex].value == 'labenvironmentdailydisplay'
274      || frm.reporttype[frm.reporttype.selectedIndex].value == 'labenvironmentweeklydisplay'
275      || frm.reporttype[frm.reporttype.selectedIndex].value == 'labenvironmentoverviewdisplay')
276    {
277      // Show report period input fields
278      document.getElementById("reportPeriodSubSection01").style.display = 'block';
279      document.getElementById("reportPeriodSubSection02").style.display = 'block';
280      document.getElementById("reportPeriodSubSection04").style.display = 'block';
281      document.getElementById("reportPeriodSubSection01Header").innerHTML="Date";
282      document.getElementById("reportPeriodSubSection04HelpText").innerHTML="Date (YYYYMMDD) Blank field gives current date.";
283      if (frm.reporttype[frm.reporttype.selectedIndex].value == 'labenvironmentweeklydisplay')
284      {
285        document.getElementById("reportPeriodSubSection01Header").innerHTML="Start date";
286        document.getElementById("reportPeriodSubSection04HelpText").innerHTML="Start date (YYYYMMDD) Blank field gives current date - 6 days.";
287      }
288      else if (frm.reporttype[frm.reporttype.selectedIndex].value == 'labenvironmentoverviewdisplay')
289      {
290        document.getElementById("reportPeriodSubSection01Header").innerHTML="Start Date";
291        document.getElementById("reportPeriodSubSection04HelpText").innerHTML="Start date (YYYYMMDD) Blank field gives data from start.";
292      }
293/*
294      // Show view type pop-up menu
295      document.getElementById("viewTypeSubSection01").style.display = 'block';
296      document.getElementById("viewTypeSubSection02").style.display = 'block';
297      document.getElementById("viewTypeSubSection04").style.display = 'block';
298*/
299    }
300    if (frm.reporttype[frm.reporttype.selectedIndex].value == 'labenvironmentweeklydisplay'
301      || frm.reporttype[frm.reporttype.selectedIndex].value == 'labenvironmentoverviewdisplay')
302    {
303      // Show day-time filter input fields
304      document.getElementById("dayTimeFilterSubSection01").style.display = 'block';
305      document.getElementById("dayTimeFilterSubSection02").style.display = 'block';
306      document.getElementById("dayTimeFilterSubSection04").style.display = 'block';
307    }
308    if (frm.reporttype[frm.reporttype.selectedIndex].value == 'labenvironmentweeklydisplay'
309      || frm.reporttype[frm.reporttype.selectedIndex].value == 'labenvironmentoverviewdisplay')
310    {
311      // Show weekday filter pop-up menu
312      document.getElementById("weekDayFilterSubSection01").style.display = 'block';
313      document.getElementById("weekDayFilterSubSection02").style.display = 'block';
314      document.getElementById("weekDayFilterSubSection04").style.display = 'block';
315    }
316    if (frm.reporttype[frm.reporttype.selectedIndex].value == 'labenvironmentdailydisplay'
317      || frm.reporttype[frm.reporttype.selectedIndex].value == 'labenvironmentweeklydisplay'
318      || frm.reporttype[frm.reporttype.selectedIndex].value == 'labenvironmentoverviewdisplay')
319    {
320      // Show chart data pop-up menu
321      document.getElementById("chartVariantSubSection01").style.display = 'block';
322      document.getElementById("chartVariantSubSection02").style.display = 'block';
323      document.getElementById("chartVariantSubSection04").style.display = 'block';
324    }
325    Main.show('parameterSection');
326       
327    Main.show('gocreate');   
328    Main.hide('gonext');
329    frm.fromdate.focus();
330    currentStep = 2;
331  }
332 
333  function dateOnChange()
334  {
335    var frm = document.forms['labenv'];   
336    var fdate;
337    var tdate;
338   
339    intervalIsValid = false;
340    setInputStatus('displayInterval','','valid');
341    if (frm.fromdate.value != null && frm.fromdate.value != '')
342    {
343      frm.fromdate.value = autoFillDate(frm.fromdate.value);     
344      if (!Dates.isDate(frm.fromdate.value, 'yyyyMMdd'))
345      {
346        setInputStatus('displayInterval','Not a valid from-date', 'invalid');
347        return;
348      }
349      else
350      {
351        fdate = frm.fromdate.value;
352        fdate = new Date(fdate.substr(0,4), parseInt(fdate.substr(4,2), 10)-1, fdate.substr(6,2));
353      }
354    }
355
356/*   
357    if (frm.todate.value != null && frm.todate.value != '')
358    {
359      frm.todate.value = autoFillDate(frm.todate.value);
360      if (!Dates.isDate(frm.todate.value, 'yyyyMMdd'))
361      {
362        setInputStatus('displayInterval', 'Not a valid to-date', 'invalid');
363        return;
364      }
365      else
366      {
367        tdate = frm.todate.value;
368        tdate = new Date(tdate.substr(0,4), parseInt(tdate.substr(4,2), 10)-1, tdate.substr(6,2));
369      }
370    }
371*/
372
373    if (frm.reporttype[frm.reporttype.selectedIndex].value == 'labenvironmentdailydisplay')
374    {
375      tdate = fdate;
376    }
377
378    if (tdate != null && fdate != null)
379    {
380      if (fdate > tdate)
381      {
382        setInputStatus('displayInterval', 'Invalid period', 'invalid')
383        return;
384      }     
385    }
386    intervalIsValid = true;
387  }
388 
389  function goCreate()
390  {
391    //alert("goCreate(): Start");
392    if (!intervalIsValid) return;
393    var frm = document.forms['labenv'];   
394    var reportType = frm.reporttype[frm.reporttype.selectedIndex].value;   
395    frm.fromdate.disabled = true;
396/*
397    frm.fromtime.disabled = true;
398    frm.todate.disabled = true;
399    frm.totime.disabled = true;
400*/
401    if (reportType == 'labenvironmentweeklydisplay' || reportType == 'labenvironmentoverviewdisplay')
402    {
403      frm.weekdayfilter.disabled = true;
404    }
405    if (reportType == 'labenvironmentweeklydisplay' || reportType == 'labenvironmentoverviewdisplay')
406    {
407      frm.filterfromtime.disabled = true;
408      frm.filtertotime.disabled = true;
409    }
410    var chartVariant = frm.chartvariant[frm.chartvariant.selectedIndex].value;   
411    if (reportType == 'labenvironmentdailydisplay' ||
412      reportType == 'labenvironmentweeklydisplay' ||
413      reportType == 'labenvironmentoverviewdisplay')
414    {
415      frm.chartvariant.disabled = true;
416    }
417    Main.hide('gocreate');
418    Main.show('reportSection');
419    var url = '../LabEnvironmentDisplay.servlet?ID=<%=ID%>&cmd='+reportType;   
420   
421    if (frm.fromdate.value != null) url += '&fdate='+frm.fromdate.value;
422/*
423    if (frm.fromtime.value != null) url += '&ftime='+frm.fromtime.value;
424    if (frm.todate.value != null) url += '&tdate='+frm.todate.value;
425    if (frm.totime.value != null) url += '&ttime='+frm.totime.value;
426*/
427    if (reportType == 'labenvironmentweeklydisplay' || reportType == 'labenvironmentoverviewdisplay')
428    {
429      if (frm.weekdayfilter.value != null) url += '&weekdayfilter='+frm.weekdayfilter.value;
430    }
431    if (reportType == 'labenvironmentweeklydisplay' || reportType == 'labenvironmentoverviewdisplay')
432    {
433      if (frm.filterfromtime.value != null) url += '&filterfromtime='+frm.filterfromtime.value;
434      if (frm.filtertotime.value != null) url += '&filtertotime='+frm.filtertotime.value;
435    }
436    if (reportType == 'labenvironmentdailydisplay' ||
437      reportType == 'labenvironmentweeklydisplay' ||
438      reportType == 'labenvironmentoverviewdisplay')
439    {
440      if (frm.chartvariant.value != null) url += '&cvariant='+frm.chartvariant.value;
441    }
442   
443   
444    var request = Ajax.getXmlHttpRequest();
445    request.open("GET", url, true);
446    Ajax.setReadyStateHandler(request, onPlotGenerated);
447    request.send(null);
448  }
449 
450  function onPlotGenerated(request)
451  {
452    var frm = document.forms['labenv'];   
453    var reportType = frm.reporttype[frm.reporttype.selectedIndex].value;
454    //alert("onPlotGenerated(): reportType = " + reportType);
455    if (debug) Main.debug(Main.encodeTags(request.responseText));
456    var response = JSON.parse(request.responseText); 
457    if (response.status != 'ok')
458    {
459      setFatalError(response.message);
460      return false;
461    }
462    var report = response.report;
463    var permissionDeniedForPatientName = report.permissionDeniedForPatientName;
464    var reportTable;
465    var cellElement = document.getElementById('reportdiv');
466   
467    if (report != null)
468    {
469      //if ('labenvironmentdailydisplay' == reportType)
470      if (reportType == 'labenvironmentdailydisplay' ||
471        reportType == 'labenvironmentweeklydisplay' ||
472        reportType == 'labenvironmentoverviewdisplay')
473      {
474        //alert("onPlotGenerated(): Inside plot block for labenvironmentdailydisplay");
475        var storageIntervalInSeconds = getStorageIntervalInSeconds();
476        var draw_area_wdt = 700;
477        var draw_area_hgt = 550;
478        var draw_scale_factor = 2;
479        var jsonStatisticsPlotArray = report.plotStatistics;
480        // Draw plots
481        setInnerHTML('reportdiv', '');
482        for (var plotIndex in jsonStatisticsPlotArray)
483        {
484          //
485          // Get plot JSON data container with extra info and plot data
486          var plotJsonDataContainer = jsonStatisticsPlotArray[plotIndex];
487          // Get plot JSON extra info and plot data
488          var plotChartVariant = plotJsonDataContainer['chartVariant'];
489          var plotViewType = plotJsonDataContainer['viewType'];
490          var plotOptionalHeadline = plotJsonDataContainer['optionalHeadline'];
491          var boxPlotJsonData = plotJsonDataContainer['plotData'];
492          // Create plot from plot JSON data
493          if (plotOptionalHeadline != null && plotOptionalHeadline != '')
494          {
495            // Print optional headline
496            var headlineText = document.createElement('text');
497            headlineText.innerHTML = "<BR>" + plotOptionalHeadline + "<BR>";
498            cellElement.appendChild(headlineText);
499          }
500          var plotKey = plotChartVariant + '_' + plotViewType;
501          // Add plot
502          var canvasInTable = document.createElement('canvas');
503          canvasInTable.setAttribute('id', plotKey);
504          canvasInTable.setAttribute('width', draw_area_wdt * draw_scale_factor);
505          canvasInTable.setAttribute('height', draw_area_hgt * draw_scale_factor);
506          createGraphPlot(boxPlotJsonData, canvasInTable, draw_area_wdt, draw_area_hgt, draw_scale_factor, plotViewType, storageIntervalInSeconds);
507          cellElement.appendChild(canvasInTable);         
508          canvasInTable.addEventListener('mousemove', drawCanvasGuidelines, false);
509          canvasInTable.addEventListener('mouseleave', hideCanvasGuidelines, false);
510        }
511        // Print optional appended info
512        var appendedInfo = report.appendedInfo;
513        if (appendedInfo != null && appendedInfo != '')
514        {
515          // Print optional headline
516          var infoText = document.createElement('text');
517          infoText.innerHTML = "<BR>" + appendedInfo + "<BR>";
518          cellElement.appendChild(infoText);
519        }
520      }
521    }
522    else
523    {
524      var messageCell = getTableCellElement('No values could be found during given period', 'reportheader');
525      var messageRow = document.createElement('tr');
526      messageRow.appendChild(messageCell);     
527      var messageTable = getReportTable();
528      messageTable.appendChild(messageRow);
529      reportTable = messageTable;     
530    }
531    Main.show('printButton');
532    Main.show('gorestart');   
533  }
534
535  function getJSONData(jsonObject, key)
536  {
537    var data = getJSONData(jsonObject, key, '');
538    return data;
539  }
540
541  function getJSONData(jsonObject, key, defaultChoice)
542  {
543    var data = defaultChoice;
544    if (jsonObject != null)
545    {
546      if (jsonObject[key] != null)
547      {
548        data = jsonObject[key];
549      }
550    }
551    return data;
552  }
553
554  function getReportTable()
555  {
556      var reportTable = document.createElement('table');
557      reportTable.setAttribute('class','reporttable');
558      reportTable.setAttribute('border','1');     
559      return reportTable;
560  }
561 
562  function getTableCellElement(text, clazz, colspan, rowspan)
563  {
564    var cellElement = document.createElement('td');
565    text = new String(text);   
566    var textArray = text.split("\n");   
567    if (textArray.length > 1)
568    {
569      for (var i=0;i<textArray.length;i++)
570      {       
571        if (i>0)cellElement.appendChild(document.createElement('br'));
572        cellElement.appendChild(document.createTextNode(textArray[i]));
573      }     
574    }
575    else
576    {
577      cellElement.appendChild(document.createTextNode(text));
578    }
579    cellElement.setAttribute('class', clazz);
580    if (colspan != null) cellElement.setAttribute('colspan', colspan);
581    if (rowspan != null) cellElement.setAttribute('rowspan', rowspan);
582   
583    return cellElement;
584  }
585 
586  function getListElement(itemText)
587  {
588    var listElement = document.createElement('li');
589    var textNode = document.createTextNode(itemText);
590    listElement.appendChild(textNode);
591    return listElement;
592  }
593
594  /**
595   *  addHyphensToDateStr()
596   *
597   *  Adds hyphens to date string in yyyymmdd format to
598   *  get yyyy-mm-dd format. If input string already contains
599   *  hyphen(s), the input string is returned unchanged.
600   *  If input string is null or empty, '????-??-??' is returned.
601   *
602   *  @param dateStr String Input date string in yyyy-mm-dd or yyyymmdd format.
603   *  @return String Date string in yyyy-mm-dd format.
604   */
605  function addHyphensToDateString(dateStr)
606  {
607    var dateWithHyphensStr = '????-??-??';
608    if (dateStr != null && dateStr != '')
609    {
610      // Check if input string already contains hyphen
611      if (dateStr.indexOf("-") >= 0)
612      {
613        // Date already has hyphen(s)
614        dateWithHyphensStr = dateStr;
615      }
616      else
617      {
618        // Date in yyyymmdd format
619        var yearStr = dateStr.substr(0,4);
620        var monthStr = dateStr.substr(4,2);
621        var dayStr = dateStr.substr(6,2);     
622        dateWithHyphensStr = yearStr + '-' + monthStr + '-' + dayStr;
623      }
624    }
625    return dateWithHyphensStr;
626  }
627
628  /**
629   *  dateStrToDate()
630   *
631   *  Takes an input date string in yyyy-mm-dd or yyyymmdd format
632   *  and returns a date corresponding to the date string.
633   *  If input string is null or empty, null is returned.
634   *
635   *  @param dateStr String Input date string in yyyy-mm-dd or yyyymmdd format.
636   *  @return Date Date corresponding to input date string.
637   */
638  function dateStrToDate(dateStr)
639  {
640    var date = null;
641    if (dateStr != null && dateStr != '')
642    {
643      // Check if input string already contains hyphen
644      if (dateStr.indexOf("-") >= 0)
645      {
646        // Date in yyyy-mm-dd format
647        var yearStr = dateStr.substr(0,4);
648        var monthStr = dateStr.substr(5,2);
649        var dayStr = dateStr.substr(8,2);     
650        var date = new Date(parseInt(yearStr, 10), parseInt(monthStr, 10)-1, parseInt(dayStr, 10));
651      }
652      else
653      {
654        // Date in yyyymmdd format
655        var yearStr = dateStr.substr(0,4);
656        var monthStr = dateStr.substr(4,2);
657        var dayStr = dateStr.substr(6,2);     
658        var date = new Date(parseInt(yearStr, 10), parseInt(monthStr, 10)-1, parseInt(dayStr, 10));
659      }
660    }
661    return date;
662  }
663
664  /*
665   *  Get the ISO week number for a given date
666   *
667   *  Based on code at http://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php
668   *
669   *  @param date String Input date to get ISO week number for.
670   *  @return int ISO week number for input date.
671   */
672  function getISOWeekNumber(date)
673  {
674    tmpDate = new Date(date);
675    tmpDate.setHours(0,0,0);
676    // Set to nearest Thursday: current date + 4 - current day number
677    // Make Sunday day number 7
678    tmpDate.setDate(tmpDate.getDate() + 4 - (tmpDate.getDay() || 7));
679    // Get first day of year
680    var yearStart = new Date(tmpDate.getFullYear(), 0, 1);
681    // Calculate full weeks to nearast Thursday (86400000 = 24*60*60*1000 number of ms in a day)
682    var weekNo = Math.ceil(( ( (tmpDate - yearStart) / 86400000) + 1)/7);
683    return weekNo;
684  }
685
686  function goPrint()
687  {
688    var printNote = '<b>Note!</b> For better printing set page orientation to <i>portrait</i>.';
689    printNote += ' Scale down to <i>90%</i> to fit 2 plots per page.';
690    openPrintWindow('<%=ID%>', 'reportcell', 'Lab environment ', 'portrait', printNote, '../');
691  }
692 
693  var xGuide;
694  var yGuide;
695 
696  function drawCanvasGuidelines(event)
697  {
698    if (!xGuide)
699    {
700      xGuide = document.getElementById('x-guide');
701      yGuide = document.getElementById('y-guide');
702    }
703    var canvas = event.target;
704    var centerX = event.clientX;
705    var centerY = event.clientY;
706    var canvasPos = Main.getElementPosition(canvas);
707    var startX = canvasPos.left+50;
708    var widthX = canvasPos.width-100;
709    var startY = canvasPos.top+80;
710    var heightY = canvasPos.height-160;
711    if (centerY < startY || centerY > startY+heightY)
712    {
713      // Hide when mouse is in the text area below or over the plot
714      yGuide.style.display = 'none';
715    }
716    else
717    {
718      yGuide.style.top = (centerY-2) + 'px';
719      yGuide.style.left = startX + 'px';
720      yGuide.style.width = widthX + 'px';
721      yGuide.style.display = 'block';
722    }
723    if (centerX < startX || centerX > startX + widthX)
724    {
725      // Hide when mouse is in the text area to the left or right of the plot
726      xGuide.style.display = 'none';
727    }
728    else
729    {
730      // Avoid drawing outside the avilable hight (causes an extra pair of scroll bars)
731      var yLimit = Main.getWindowHeight();
732      if (startY+heightY > yLimit)
733      {
734        heightY = yLimit-startY;
735      }
736      xGuide.style.top = startY + 'px';
737      xGuide.style.left = (centerX-2) + 'px';
738      xGuide.style.height = heightY + 'px';
739      xGuide.style.display = 'block';
740    }
741
742  }
743 
744  function hideCanvasGuidelines(event)
745  {
746    xGuide.style.display = 'none';
747    yGuide.style.display = 'none';
748  }
749  </script>
750 
751  <style>
752  canvas
753  {
754    width: 700px;
755    height: 550px;
756  }
757  </style>
758  </base:head>
759  <base:body onload="init()">
760    <p:path><p:pathelement 
761      title="LabEnv" href="<%="./labenvironmentdatabasedisplay.jsp?ID="+ID%>" 
762      /><p:pathelement title="Lab environment display" 
763      /></p:path>
764    <div id="x-guide" style="position: absolute; z-index: 99; display: none; background-color: #224488; width: 1px;"></div>
765    <div id="y-guide" style="position: absolute; z-index: 99; display: none; background-color: #224488; height: 1px;"></div>
766    <div class="content">
767    <%
768    if (sc.getActiveProjectId() == 0)
769    {
770      %>
771      <div class="messagecontainer note" style="width: 950px; margin-left: 20px; margin-bottom: 20px; margin-right: 0px; font-weight: bold; color: #cc0000;">
772        No project has been selected. You may proceed with the report generation but
773        only your own items will be included in the report.
774      </div>
775      <%
776    }
777    %>
778 
779    <form name="labenv" onsubmit="return false;">
780      <!-- 1. Report type-->
781      <table border="0" cellspacing="0" cellpadding="0" class="stepform">
782      <tr>
783        <td rowspan="3" class="stepno">1</td>
784        <td class="steptitle">Report type</td>
785      </tr>
786      <tr>
787        <td class="stepfields">
788          <table border="0" cellspacing="0" cellpadding="0" width="100%">
789          <tr valign="top">
790            <td class="prompt">Report</td>
791            <td class="input">
792              <select name="reporttype">
793                <option value="labenvironmentdailydisplay" selected="yes">Daily display</option>
794                <option value="labenvironmentweeklydisplay">Weekly display</option>
795                <option value="labenvironmentoverviewdisplay">Overview display</option>
796              </select>
797            </td>
798            <td class="status" id="report.status"></td>
799            <td class="help">
800              <span id="report.message" class="message" style="display: none;"></span>
801              Select which report to generate.
802            </td>
803          </tr>
804          </table>
805        </td>
806      </tr>
807      </table>
808     
809      <div id="parameterSection" style="display:none;">
810        <p></p>
811        <!-- 2. Report parameters-->
812        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
813        <tr>
814          <td rowspan="3" class="stepno">2</td>
815          <td class="steptitle">Report parameters</td>
816        </tr>
817        <tr>
818          <td class="stepfields">
819            <table border="0" cellspacing="0" cellpadding="0" width="100%">           
820            <tr>
821              <td valign="top" class="prompt">
822                <div id="reportPeriodSubSection01" style="display:none;">
823                  <text id="reportPeriodSubSection01Header">From</text>
824                </div>
825              </td>
826              <td valign="top" class="input">
827                <div id="reportPeriodSubSection02" style="display:none;">
828                  Date <input type="text" name="fromdate" value="" size="12" maxlength="10" 
829                  onkeypress="focusOnEnter(event, 'chartvariant')" onblur="fromDateTimeOnChange()">
830<!--
831                  Time <input type="text" name="fromtime" value="" size="6" maxlength="4"
832                  onkeypress="focusOnEnter(event, 'fromdate')" onblur="fromDateTimeOnChange()">
833-->
834                </div>
835              </td>
836              <td valign="top" class="status" id="sensorSelect.status"></td>
837              <td class="help">
838                <div id="reportPeriodSubSection04" style="display:none;">
839                  <span id="sensorSelect.message" class="message" style="display: none;"></span>
840                  <text id="reportPeriodSubSection04HelpText">Select sensor(s)</text><br>
841                </div>
842              </td>
843            </tr>
844            <tr>
845              <td valign="top" class="prompt">
846                <div id="dayTimeFilterSubSection01" style="display:none;">
847                  Daytime filter
848                </div>
849              </td>
850              <td valign="top" class="input">
851                <div id="dayTimeFilterSubSection02" style="display:none;">
852                  From time <input type="text" name="filterfromtime" value="" size="6" maxlength="4" 
853                  onkeypress="focusOnEnter(event, 'filtertotime')" onblur="toDateTimeOnChange()">
854                  To time <input type="text" name="filtertotime" value="" size="6" maxlength="4" 
855                  onkeypress="focusOnEnter(event, 'todate')" onblur="toDateTimeOnChange()">
856                </div>
857              </td>
858              <td valign="top" class="status" id="dayTimeFilter.status"></td>
859              <td class="help">
860                <div id="dayTimeFilterSubSection04" style="display:none;">
861                  <span id="dayTimeFilter.message" class="message" style="display: none;"></span>
862                  Select what daytime interval to include in statistics (HHMM). Note that climate control in some labs are only active during day. Blank fields give data for full day.
863                </div>
864              </td>
865            </tr>
866            <tr>
867              <td valign="top" class="prompt">
868                <div id="weekDayFilterSubSection01" style="display:none;">
869                  Week day filter
870                </div>
871              </td>
872              <td valign="top" class="input">
873                <div id="weekDayFilterSubSection02" style="display:none;">
874                  <select id="weekDayFilterSelectId" name="weekdayfilter">
875                    <option value="all">All</option>
876                    <option value="mondaytofriday">Mon-Fri only</option>
877                    <option value="saturdaytosunday">Sat-Sun only</option>
878                    <option value="workdays" selected="yes">Workdays</option>
879                    <option value="nonworkdays">Non-workdays</option>
880                  </select>
881                </div>
882              </td>
883              <td valign="top" class="status" id="weekDayFilter.status"></td>
884              <td class="help">
885                <div id="weekDayFilterSubSection04" style="display:none;">
886                  <span id="weekDayFilter.message" class="message" style="display: none;"></span>
887                  Select what weekdays to include in statistics. Note that climate control in some labs are shut down on non-workdays (Saturdays, Sundays and work-free days related to holidays).
888                </div>
889              </td>
890            </tr>
891            <tr>
892              <td valign="top" class="prompt">
893                <div id="chartVariantSubSection01" style="display:none;">
894                  Chart data
895                </div>
896              </td>
897              <td valign="top" class="input">
898                <div id="chartVariantSubSection02" style="display:none;">
899                  <select id="sensorSelectId" name="chartvariant">
900                    <option value="all">All</option>
901                  </select>
902                </div>
903              </td>
904              <td valign="top" class="status" id="displaychartVariant.status"></td>
905              <td class="help">
906                <div id="chartVariantSubSection04" style="display:none;">
907                  <span id="displaychartVariant.message" class="message" style="display: none;"></span>
908                  Select what data to report.
909                </div>
910              </td>
911            </tr>
912            </table>
913          </td>
914        </tr>
915        </table>
916      </div>
917     
918      <div id="reportSection" style="display:none;">
919        <p></p>
920        <table border="0" cellspacing="0" cellpadding="0" class="stepform">
921        <tr>
922          <td rowspan="3" class="stepno">3</td>
923          <td class="steptitle">Generated report
924            <span id="printButton" class="link" style="float:right; display: none;" onclick="goPrint()"><img src="../images/print.png" style="padding-right: 0.5em;">Print version&hellip;</span>
925          </td>
926        </tr>
927        <tr>
928          <td id="reportcell" class="stepfields">
929            <div id="reportdiv" style="text-align: center;">
930              <div class="loading" id="loading">
931              <table>
932              <tr>
933                <td><img src="../images/loading.gif"></td>
934                <td id="loading.msg">Generating report...</td>
935              </tr>
936              </table>
937              </div>
938            </div>
939          </td>
940        </tr>
941        </table>
942      </div> 
943     
944      <div class="messagecontainer error" id="errorMessage" style="display: none; width: 950px; margin-left: 20px; margin-bottom: 0px;"></div>   
945       
946      <table style="margin-left: 20px; margin-top: 10px;" class="navigation">
947        <tr>
948          <td><base:button id="gocancel" title="Cancel" onclick="goRestart(false)" style="display: none;"/></td>
949          <td><base:button id="gonext" title="Next" image="<%="gonext.png"%>" onclick="goNext(true)" /></td>
950          <td><base:button id="gocreate" title="Generate" image="<%="gonext.png"%>" onclick="goCreate()" style="display: none;"/></td>         
951          <td><base:button id="gorestart" title="Restart" image="<%="goback.png"%>" onclick="goRestart(true)" style="display: none;"/></td>
952          <td id="gonext.message" class="message"></td>
953        </tr>
954      </table>     
955    </form>
956    </div>
957   
958  </base:body>
959  </base:page>
960  <%
961}
962finally
963{
964  if (dc != null) dc.close();
965}
966%>
Note: See TracBrowser for help on using the repository browser.