· 5 years ago · Feb 11, 2020, 02:18 PM
1<%@ Page Title="" Language="C#" MasterPageFile="~/User/MasterPage.master" AutoEventWireup="true" CodeBehind="CreateReport.aspx.cs" Inherits="CloudBeat.User.CreateReport" %>
2
3<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
4 <meta http-equiv='cache-control' content='no-cache' />
5 <meta http-equiv='expires' content='0' />
6 <meta http-equiv='pragma' content='no-cache' />
7</asp:Content>
8<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
9 <script src="../js/pattern-fill-v2.js"></script>
10 <script>
11 var currentStudyId;
12
13 var includedEvents;
14 var currentStudyType;
15 var studyTotalEvents; //All Accepted events even those not included in reporting
16
17
18 //Variables related to the template used
19 var clinicalSummaryType; // [1 => Numbering, 2 => Pie Chart , 3=> Circles]
20 var HRIncluded;
21 var BurdenIncluded;
22 var HRType;// [1 => Line Chart, 2 => Bar Chart]
23 var BurdenType; //[1=>Column Chart,2=>Line Chart]
24 var eventDuration; //8 seconds or 15 seconds
25 var hrMeasurementPresentation; //It's either split (Values, date and time are separated), Merged (format: value on date @ time) or None (No HR measurements included)
26 var stripsIncluded;
27
28 var HRChart;
29 var ArrChart;
30
31 var PieChart;
32
33 var totalEventsChart;
34 var ptEventsChart;
35 var PauseEventsChart;
36 var bradyEventsChart;
37 var tachyEventsChart;
38 var aFEventsChart;
39
40 var minYLimit;
41 var maxYLimit;
42
43 var minHR;
44 var maxHR;
45 var avgHR;
46
47 var amplitudeMultiplier = 0.00296499999240041;
48 var currentLoop;
49 var currentLoopIsOver = true;
50 var options;
51 var burdenGraphIncluded = true;
52
53 var heartRateDataLength = 0;
54 var heartRateRowDataReport = 0;
55
56 var hrMeasurementValues = 'Average';
57
58 //Patterns definitions for the burden chart
59 var linePattern1 = 'M 10 0 L 0 10 M 11 9 L 9 11 M 1 -1 L -1 1';
60 var linePattern2 = 'M 0 0 L 10 10 M 9 -1 L 11 1 M -1 9 L 1 11';
61 var linePattern3 = 'M 0 0 L 10 0 M 0 5 L 10 5 M 0 10 L 10 10';
62
63
64 var allEventTypes = [];
65
66 var timeZone;
67 var isMobile = false;
68 var currentUTCHour = 0;
69 var returnedSavedReportId;
70
71 var studyProviderRole = "Provider";
72
73 let providerId;
74
75 var monitoredHrsVisibility = true;
76 var tachyBurdenVisibility = true;
77 var bradyBurdenVisibility = true;
78 var afBurdenVisibility = true;
79
80 let hrCalculationEvents = false;
81 let minHREvents = 0;
82 let maxHREvents = 0;
83 let avgHREvents = 0;
84
85 let minHREventsDate;
86 let maxHREventsDate;
87
88
89 const arrMin = arr => Math.min(...arr);
90 const arrMax = arr => Math.max(...arr);
91 const arrAvg = arr => arr.reduce((a, b) => a + b, 0) / arr.length
92
93 var reportType = "EOSReport";
94 var studyStartTime;
95 var studyEndTime;
96
97 var txtStudyMaxHR;
98 var txtStudyMinHR;
99 var txtStudyAvgHR;
100 var txtStudyMaxHRDate;
101 var txtStudyMinHRDate;
102
103 var companyMinHRVisibility = true;
104 var companyMaxHRVisibility = true;
105
106 $(document).ready(function () {
107 $('#page-title').text('REPORT');
108
109 if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent)
110 || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0, 4))) isMobile = true;
111
112 $('#page-title').text('REPORT');
113
114 Highcharts.wrap(Highcharts.Chart.prototype, 'init', function (proceed, options, callback) {
115 if (options.chart && options.chart.forExport && options.series) {
116 $.each(options.series, function () {
117 if (this.visible === false) {
118 this.showInLegend = false;
119 this.color = 'transparent';
120 }
121 });
122 }
123
124 return proceed.call(this, options, callback);
125 });
126
127 Highcharts.setOptions({
128 time: {
129 /**
130 * Use moment-timezone.js to return the timezone offset for individual
131 * timestamps, used in the X axis labels and the tooltip header.
132 */
133 getTimezoneOffset: function (timestamp) {
134 var zone = timeZone,
135 timezoneOffset = -moment.tz(timestamp, zone).utcOffset();
136 return timezoneOffset;
137 }
138 },
139 global: {
140 useUTC: true
141 }
142 });
143
144 $('#selectReportRDG').change(function () {
145
146 switch ($(this).val()) {
147 case 'dgOneMinute':
148 GroupingOneMinuteReport(heartRateRowDataReport, minHRVisibility, avgHRVisibility, maxHRVisibility);
149 break;
150 case 'dgFifteenMinutes':
151 GroupingFifteenMinutesReport(heartRateRowDataReport, minHRVisibility, avgHRVisibility, maxHRVisibility);
152 break;
153 case 'dgThirtyMinutes':
154 GroupingThirtyMinutesReport(heartRateRowDataReport, minHRVisibility, avgHRVisibility, maxHRVisibility);
155 break;
156 case 'dgOneHour':
157 GroupingOneHourReport(heartRateRowDataReport, minHRVisibility, avgHRVisibility, maxHRVisibility);
158 break;
159 case 'dgOneDay':
160 GroupingOneDayReport(heartRateRowDataReport, currentUTCHour, minHRVisibility, avgHRVisibility, maxHRVisibility);
161 break;
162 }
163 HRChart = new Highcharts.Chart(options);
164 var extremes = HRChart.yAxis[0].getExtremes();
165 minHR = extremes.dataMin;
166 maxHR = extremes.dataMax;
167 avgHR = parseInt((minHR + maxHR) / 2);
168 });
169
170 LoadPatientDataAndTemplate();
171
172
173 });
174
175 function LoadPatientDataAndTemplate() {
176 includedEvents = [];
177 var param = '{"studyId":' + $("#hfCurrentStudyId").val() + '}';
178 $.ajax({
179 url: '<%=ResolveUrl("~/User/Services/WebServices.asmx/GetStudyForPatient") %>',
180 data: param,
181 dataType: "json",
182 type: "POST",
183 contentType: "application/json;",
184 success: function (returnedStudy) {
185
186 if (returnedStudy != null) {
187 timeZone = returnedStudy.d.TimeZone;
188 currentStudyId = returnedStudy.d.StudyId;
189 patientId = returnedStudy.d.PatientId;
190 providerId = returnedStudy.d.ProviderId;
191 //Get company preference for ReportHideMinMaxHeartRate
192
193 var companyPreferenceValue = "ReportHideMinMaxHeartRate";
194 $.ajax({
195 url: '<%=ResolveUrl("~/User/Services/WebServices.asmx/GetCompanyPreference") %>',
196 data: JSON.stringify({
197 companyPreferenceValue: companyPreferenceValue
198 }),
199 dataType: "json",
200 type: "POST",
201 contentType: "application/json;",
202 async: false,
203 success: function (accData) {
204
205 var data = accData.d;
206 if (data != null) {
207 companyMinHRVisibility = data.toLowerCase() == "false" ? true : false;
208 companyMaxHRVisibility = data.toLowerCase() == "false" ? true : false;
209 }
210 }
211 });
212
213 //Get Study's ProviderRole
214 $.ajax({
215 url: './Services/WebServices.asmx/GetStudyProviderRole',
216 dataType: "json",
217 data: JSON.stringify({
218 studyId: currentStudyId
219 }),
220 type: "POST",
221 async: false,
222 contentType: "application/json;",
223 success: function (returnedStudyProviderRole) {
224 if (returnedStudyProviderRole.d.ProviderRole == "Monitoring Provider" && (returnedStudyProviderRole.d.UserRoleId == 4)) {
225 isTechnician = true;
226 studyProviderRole = "Monitoring Provider";
227 $('#btnCreateReport').css("display", "none");
228 }
229 else {
230 if (returnedStudyProviderRole.d.AnonymizedUser && (returnedStudyProviderRole.d.UserRoleId == 4)) {
231 isAnonymTechnician = true;
232 $('#btnCreateReport').css("display", "none");
233 } else {
234 $('#btnCreateReport').css("display", "block");
235 }
236 }
237 }
238 });
239
240 var reportTypeId;
241 switch (reportType) {
242 case "EOSReport":
243 reportTypeId = 4;
244 break;
245 case "WeeklyReport":
246 reportTypeId = 3;
247 break;
248 case "DailyReport":
249 reportTypeId = 2;
250 break;
251 default:
252 reportTypeId = 4;
253 break;
254 }
255
256
257 //Get the template, the report type is the one existing in the database table ReportTypes
258 var params = '{"studyId":"' + currentStudyId + '","reportTypeId":' + reportTypeId + '}';
259 $.ajax({
260 url: '<%=ResolveUrl("~/User/Services/WebServices.asmx/GetUserAssignedTemplate") %>',
261 data: params,
262 dataType: "json",
263 type: "POST",
264 contentType: "application/json;",
265 success: function (returnedTemplate) {
266
267 if (returnedTemplate != null) {
268 var template = returnedTemplate.d;
269 clinicalSummaryType = template.StatisticsTypeId;
270 HRIncluded = template.HRIncluded;
271 BurdenIncluded = template.BurdenIncluded;
272 HRType = template.HRGraphTypeId;
273 BurdenType = template.BurdenGraphTypeId;
274 eventDuration = template.EventDuration;
275 hrMeasurementPresentation = template.HRMeasurementPresentation;
276 stripsIncluded = template.StripsIncluded == null ? 0 : (template.StripsIncluded == true ? 1 : 0);
277 hrCalculationEvents = template.HRCalculationEvents;
278 hrMeasurementValues = template.HRMeasurementValues;
279 } else {
280 //Get the default values
281 clinicalSummaryType = 1;
282 HRIncluded = true;
283 BurdenIncluded = true;
284 HRType = 1;
285 BurdenType = 1;
286 eventDuration = 15; // The default value of ECG is 15
287 hrMeasurementPresentation = 'Merged';
288 stripsIncluded = 0;
289 hrMeasurementValues = 'Average';
290 }
291
292 $('#txtStudyStartingDate').datepicker({
293 controlType: 'select',
294 timeFormat: 'hh:mm tt',
295 minDate: fromJsonToJavaScriptDateTime(returnedStudy.d.StudyStartTime).split(' ')[0],
296 maxDate: fromJsonToJavaScriptDateTime(returnedStudy.d.StudyEndTime).split(' ')[0]
297 });
298 $('#txtStudyEndDate').datepicker({
299 controlType: 'select',
300 timeFormat: 'hh:mm tt',
301 minDate: fromJsonToJavaScriptDateTime(returnedStudy.d.StudyStartTime).split(' ')[0],
302 maxDate: fromJsonToJavaScriptDateTime(returnedStudy.d.StudyEndTime).split(' ')[0]
303 });
304
305 studyStartTime = moment(returnedStudy.d.StudyStartTime).format('MM/DD/YYYY');
306 studyEndTime = moment(returnedStudy.d.StudyEndTime).format('MM/DD/YYYY');
307
308 if (reportType == "EOSReport") {
309 $('#txtStudyStartingDate').val(studyStartTime);
310 $('#txtStudyEndDate').val(studyEndTime);
311 LoadEvents(null);
312 }
313
314 $('#txtReportStudyType').val(returnedStudy.d.ReportType == "M.C.T" ? "Mobile Cardiac Telemetry" : (returnedStudy.d.ReportType == "W.E" ? "Wireless Event" : returnedStudy.d.ReportType));
315 currentStudyType = $('#txtReportStudyType').val();
316 if (!HRIncluded && !BurdenIncluded) {
317 //Hide the HR and Burden charts for wireless event
318 $('#divHRAndBurdenGraphs').hide();
319 }
320
321 if (hrMeasurementPresentation == 'None') {
322 $('#divHeartRateMeasurements').hide();
323 }
324
325 var sdyStartTime = fromJsonToJavaScriptDateTime(returnedStudy.d.StudyStartTime);
326 var sdyEndTime = fromJsonToJavaScriptDateTime(returnedStudy.d.StudyEndTime);
327 $('#txtReportStudyStartTime').val(sdyStartTime.split(':')[0] + ":" + sdyStartTime.split(':')[1]);
328 $('#txtReportStudyEndTime').val(sdyEndTime.split(':')[0] + ":" + sdyEndTime.split(':')[1]);
329 $('#txtCustomPatientName').val(returnedStudy.d.FirstName + ' ' + returnedStudy.d.MiddleName + ' ' + returnedStudy.d.LastName);
330 $('#txtCustomProviderName').val(returnedStudy.d.ProviderName);
331
332 if ($('#hfSavedEventId').val() != -1) {
333 $.ajax({
334 url: '<%=ResolveUrl("~/User/Services/WebServices.asmx/LoadSavedReport") %>',
335 data: JSON.stringify({
336 savedReportId: $('#hfSavedEventId').val()
337
338 }),
339 dataType: "json",
340 type: "POST",
341 async: true,
342 contentType: "application/json",
343 success: function (message) {
344 var data = message.d;
345
346 $('#txtStudyStartingDate').val(moment(data.ReportStudyStartTime).format('MM/DD/YYYY'));
347 $('#txtStudyEndDate').val(moment(data.ReportStudyEndTime).format('MM/DD/YYYY'));
348
349 LoadEvents(data.HrGouping);
350
351 $('#txtFindings').val(data.Findings);
352 $('#txtPhysInterpretation').val(data.PhysInterpretation);
353 $('#txtSymptomatic').val(data.NumberOfSymptomatic);
354 $('#txtAsymptomatic').val(data.NumberOfAsymptomatic);
355 $('#txtAF').val(data.NumberOfAf);
356 $('#txtTachy').val(data.NumberOfTachy);
357 $('#txtBrady').val(data.NumberOfBrady);
358 $('#txtPause').val(data.NumberOfPause);
359 $('#txtMinHR').val(data.MinHR);
360
361 $('#txtMaxHR').val(data.MaxHR);
362 $('#txtAvgHR').val(data.AvgHR);
363 $('#txtMinHRDate').val(moment.utc(data.MinHRDate).format('MM/DD/YYYY hh:mm'));
364 $('#txtMaxHRDate').val(moment.utc(data.MaxHRDate).format('MM/DD/YYYY hh:mm'));
365
366 var fromDate = $('#txtStudyStartingDate').val();
367 var toDate = $('#txtStudyEndDate').val();
368
369 monitoredHrsVisibility = data.MonitoredHrsVisibility;
370 tachyBurdenVisibility = data.TachyBurdenVisibility;
371 bradyBurdenVisibility = data.BradyBurdenVisibility;
372 afBurdenVisibility = data.AfBurdenVisibility;
373
374 maxHRVisibility = data.MaxHRVisibility;
375 avgHRVisibility = data.AvgHRVisibility;
376 minHRVisibility = data.MinHRVisibility;
377
378 DrawHRGraph($("#hfCurrentStudyId").val(), fromDate, toDate, data.HrGouping);
379
380 $('#selectReportRDG').val(data.HrGouping);
381 var parameters = '{"studyId":"' + $("#hfCurrentStudyId").val() + '","fromDate":"' + fromDate + '","toDate":"' + toDate + '"}';
382
383
384 BurdenIncluded = data.BurdenGraphIncluded;
385 if (!BurdenIncluded) {
386 burdenGraphIncluded = false;
387 $('#btnExcludeBurdenGraph').removeClass('event-included');
388 $('#btnExcludeBurdenGraph').addClass('event-excluded');
389 }
390 }
391
392 });
393 }
394 if ($('#hfbtnSaveReportStyle').val() == "block") {
395 $("#btnSaveReport").css('display', 'block');
396 }
397 },
398 error: function () {
399 },
400 failure: function () {
401 }
402 });
403 }
404
405 },
406 error: function () {
407 },
408 failure: function () {
409 }
410 });
411
412 //Get event types
413 $.ajax({
414 url: './Services/WebServices.asmx/GetEventTypes',
415 dataType: "json",
416 type: "POST",
417 async: true,
418 contentType: "application/json;",
419 success: function (returnedEventTypes) {
420 allEventTypes = returnedEventTypes.d;
421
422 }
423 });
424 }
425
426 function LoadComments(e, eventId, stripId) {
427
428 $('#notesDialog').dialog('destroy').remove();
429 $('#eventNotesDialogue').dialog('destroy').remove();
430 $('#notesDialog').attr("z-index", "99999999999999999");
431
432 e.preventDefault();
433 var d = new Date();
434 var n = d.getTimezoneOffset();
435 if (stripId == 0) {
436 var parameters = '{"eventId":"' + eventId + '","dateOffest":"' + n + '"}';
437 $.ajax({
438 url: '<%=ResolveUrl("~/User/Services/WebServices.asmx/GetEventComments") %>',
439 data: parameters,
440 dataType: "json",
441 type: "POST",
442 contentType: "application/json;",
443 success: function (result) {
444 var notes = result.d;
445 var htmlTemplate = '<div id="eventNotesDialogue" title="Notes" style="width=400px;height: 250px;background-color:white;z-index:99999999999999999999999999;">'
446 + '<ul class="dialogueList" style="max-height:210px;overflow-y:auto;">' + result.d + '</ul>'
447 + '<div>'
448 + '<textarea rows="2" id="txtNewEventNote" style="width:95%;margin-top:8px;" placeholder="Please Enter New Notes and Save"></textarea>'
449 + '</div>'
450 + '<a class="ui-button-save" href: "#" style="color:white; margin-bottom:14px;" onclick="SubmitNewComment(' + eventId + ')">Save</a>'
451 + '<a href="#" class="ui-button-cancel" data-dismiss="modal" onclick="ClosePopup()">cancel</a>'
452 + '</div>';
453
454 var dynDialog = $(htmlTemplate);
455 currentDialog = dynDialog.dialog({
456 autoOpen: false,
457 resizable: false,
458 draggable: false,
459 modal: true,
460 closeOnEscape: false,
461 open: function (event, ui) {
462 currentDialog.attr('z-index', '99999999999999');
463 currentDialog.css('zIndex', 99999999999999999);
464 $("#notesDialog").css('zIndex', 9999999999999);
465
466 $(".ui-dialog-titlebar-close", ui.dialog | ui).hide();
467
468
469
470 }
471
472
473 });
474 currentDialog.attr('id', 'notesDialog');
475 currentDialog.attr('id', 'notesDialog');
476 currentDialog.css('zIndex', 999999999999999999);
477 $("#notesDialog").css('zIndex', 99999999999999);
478
479 currentDialog.attr('z-index', '9999999999999999999999999999');
480 $('#notesDialog').parent().attr("id", "dialogBoxV2");
481 $('#eventNotesDialogue').parent().attr("id", "dialogBoxV2")
482
483 $('#txtNewEventNote').tooltipster({
484 trigger: 'hover',
485 onlyOne: false,
486 position: 'right'
487 });
488
489 dynDialog.dialog("open");
490
491 },
492 error: function () {
493 },
494 failure: function () {
495 }
496 });
497 }
498 else {
499 var parameters = '{"stripId":"' + stripId + '","dateOffest":"' + n + '"}';
500 $.ajax({
501 url: '<%=ResolveUrl("~/User/Services/WebServices.asmx/GetStripComments") %>',
502 data: parameters,
503 dataType: "json",
504 type: "POST",
505 contentType: "application/json;",
506 success: function (result) {
507 var notes = result.d;
508 var htmlTemplate = '<div id="eventNotesDialogue" title="Notes" style="width=400px;height: 250px;background-color:white;">'
509 + '<ul class="dialogueList" style="max-height:210px;overflow-y:auto;">' + result.d + '</ul>'
510 + '<div>'
511 + '<textarea rows="2" id="txtNewEventNote" style="width:95%;margin-top:8px;" placeholder="Please Enter New Notes and Save"></textarea>'
512 + '</div>'
513 + '<a class="ui-button-save" href: "#" style="color:white; margin-bottom:14px;" onclick="SubmitNewStripComment(' + stripId + ')">Save</a>'
514 + '<a href="#" class="ui-button-cancel" data-dismiss="modal" onclick="ClosePopup()">cancel</a>'
515 + '</div>';
516
517 var dynDialog = $(htmlTemplate);
518 currentDialog = dynDialog.dialog({
519 autoOpen: false,
520 resizable: false,
521 draggable: false,
522 modal: true,
523 closeOnEscape: false,
524 open: function (event, ui) {
525 currentDialog.attr('z-index', '99999999999999');
526 currentDialog.css('zIndex', 99999999999999999);
527 $("#notesDialog").css('zIndex', 9999999999999);
528 $(".ui-dialog-titlebar-close", ui.dialog | ui).hide();
529
530
531
532 }
533
534
535 });
536 currentDialog.attr('id', 'notesDialog');
537 currentDialog.attr('id', 'notesDialog');
538 currentDialog.css('zIndex', 999999999999999999);
539 $("#notesDialog").css('zIndex', 99999999999999);
540
541 currentDialog.attr('z-index', '9999999999999999999999999999');
542 $('#notesDialog').parent().attr("id", "dialogBoxV2");
543 $('#eventNotesDialogue').parent().attr("id", "dialogBoxV2")
544
545 $('#txtNewEventNote').tooltipster({
546 trigger: 'hover',
547 onlyOne: false,
548 position: 'right'
549 });
550
551 dynDialog.dialog("open");
552
553 },
554 error: function () {
555 },
556 failure: function () {
557 }
558 });
559 }
560 }
561
562 function ClosePopup() {
563
564 $('#notesDialog').dialog('destroy').remove();
565
566 }
567
568 function SubmitNewStripComment(stripId) {
569
570 if (($('#txtNewEventNote').val())) {
571
572 var parameters = '{"stripId":' + stripId + ',"information":"' + $('#txtNewEventNote').val() + '"}';
573 $.ajax({
574 url: '<%=ResolveUrl("~/User/Services/WebServices.asmx/SubmitStripComments") %>',
575 data: parameters,
576 dataType: "json",
577 type: "POST",
578 contentType: "application/json;",
579 success: function (message) {
580
581 if (message.d == "success") {
582
583 $('#notesDialog').dialog('destroy').remove();
584 $('#eventNotesDialogue').dialog('destroy').remove();
585 $(this).dialog('close');
586 $(this).dialog('close');
587 $.gritter.add({
588 title: 'Success!',
589 text: 'Notes are successfully saved',
590 class_name: 'gritter-light'
591 });
592
593
594
595 } else if (message.d == "error") {
596 $.gritter.add({
597 title: 'Attention!',
598 text: 'Please refresh and try again.</br></br>If problem persists, please contact your service provider.',
599 class_name: 'gritter-light'
600 });
601 }
602
603
604 },
605 error: function () {
606 $.gritter.add({
607 title: 'Attention!',
608 text: 'Please refresh and try again.</br></br>If problem persists, please contact your service provider.',
609 class_name: 'gritter-light'
610 });
611 },
612 failure: function () {
613
614 }
615 });
616
617 }
618
619 }
620
621 function SubmitNewComment(eventId) {
622
623 if (($('#txtNewEventNote').val())) {
624
625 var parameters = '{"eventId":' + eventId + ',"information":"' + $('#txtNewEventNote').val() + '"}';
626 $.ajax({
627 url: '<%=ResolveUrl("~/User/Services/WebServices.asmx/SubmitEventComments") %>',
628 data: parameters,
629 dataType: "json",
630 type: "POST",
631 contentType: "application/json;",
632 success: function (message) {
633
634 if (message.d == "success") {
635
636 $('#notesDialog').dialog('destroy').remove();
637 $('#eventNotesDialogue').dialog('destroy').remove();
638 $(this).dialog('close');
639 $('body').css('overflow', 'auto');
640 $.gritter.add({
641 title: 'Success!',
642 text: 'Notes are successfully saved',
643 class_name: 'gritter-light'
644 });
645
646
647
648 } else if (message.d == "error") {
649 $.gritter.add({
650 title: 'Attention!',
651 text: 'Please refresh and try again.</br></br>If problem persists, please contact your service provider.',
652 class_name: 'gritter-light'
653 });
654 }
655
656
657 },
658 error: function () {
659 $.gritter.add({
660 title: 'Attention!',
661 text: 'Please refresh and try again.</br></br>If problem persists, please contact your service provider.',
662 class_name: 'gritter-light'
663 });
664 },
665 failure: function () {
666
667 }
668 });
669
670 }
671
672 }
673
674 function LoadEvents(hrGouping) {
675 LoadPatientDataAndTemplate();
676 if ($('#hfbtnSaveReportStyle').val() == "block") {
677 $("#btnSaveReport").css('display', 'block');
678 }
679 var isValid = true;
680 includedEvents = [];
681 if (!$('#txtStudyStartingDate').valid() || $('#txtStudyStartingDate').val() == "") {
682 isValid = false;
683 }
684
685 if (!$('#txtStudyEndDate').valid() && reportType != "DailyReport") {
686 isValid = false;
687 }
688 if (isValid) {
689 ShowAllSections();
690 var div = document.getElementById('EventsResult');
691 while (div.firstChild) {
692 if (div.firstChild.nodeType == 1) {
693 var id = div.firstChild.id;
694 var evId = id.split('_')[1];
695 var chart = $('#Container_' + evId).highcharts();
696 if (chart) {
697 chart.destroy();
698 }
699 }
700 div.removeChild(div.firstChild);
701 }
702
703 var fromDate = $('#txtStudyStartingDate').val();
704 var toDate;
705
706 //Report end time
707 if (reportType == "DailyReport") {
708 fromDate = $('#txtStudyStartingDate').val();
709 var to = new Date(fromDate);
710 to.addDays(1);
711 toDate = moment(to).format('MM/DD/YYYY HH:00');
712 }
713 else {
714 toDate = $('#txtStudyEndDate').val();
715 }
716
717 //Draw chart according to the report template: if HR & Burden included in the template.
718 if (HRIncluded || BurdenIncluded) {
719 DrawHRGraph(currentStudyId, fromDate, toDate, hrGouping);
720 DrawArrhythmiaBurdenGraph(currentStudyId, fromDate, toDate);
721 }
722
723 if (!BurdenIncluded) {
724 burdenGraphIncluded = false;
725 $('#btnExcludeBurdenGraph').removeClass('event-included');
726 $('#btnExcludeBurdenGraph').addClass('event-excluded');
727 }
728
729 var parameters = '{"studyId":"' + currentStudyId + '","startingDate":"' + fromDate + '","endDate":"' + toDate + '","reportType":"' + reportType + '"}';
730 $.ajax({
731 url: '<%=ResolveUrl("~/User/Services/WebServices.asmx/GetReportClinicalInfo") %>',
732 data: parameters,
733 dataType: "json",
734 type: "POST",
735 async: false,
736 contentType: "application/json;",
737 success: function (result) {
738 txtStudyMaxHR = result.d[6];
739 txtStudyMinHR = result.d[7];
740 txtStudyAvgHR = result.d[8];
741 txtStudyMaxHRDate = result.d[9];
742 txtStudyMinHRDate = result.d[10];
743
744 if (txtStudyMaxHR == "0" && txtStudyMinHR == "0" && txtStudyAvgHR == "0" && txtStudyMaxHRDate == "" && txtStudyMinHRDate == "") {
745 hrCalculationEvents = true;
746 }
747 //Put the Statistics according to the type of the template
748 if (clinicalSummaryType == 1) {
749 //Show the releveant fields
750 $('.boxStatisticsNumbering').show();
751 if ($('#hfSavedEventId').val() == -1) {
752 $('#txtSymptomatic').val(result.d[0]);
753 $('#txtAsymptomatic').val(result.d[1]);
754 $('#txtAF').val(result.d[2]);
755 $('#txtBrady').val(result.d[3]);
756 $('#txtTachy').val(result.d[4]);
757 $('#txtPause').val(result.d[5]);
758 }
759 } else if (clinicalSummaryType == 2) {
760 //Draw Pie Chart
761 $('#boxStatisticsPie').show();
762 $('.boxStatisticsNumbering').hide();
763 studyTotalEvents = parseInt(result.d[0]) + parseInt(result.d[1]) + parseInt(result.d[2]) + parseInt(result.d[3]) + parseInt(result.d[4]) + parseInt(result.d[5]);
764 $('#txtTotalEvents').val(studyTotalEvents);
765 DrawPieChart(currentStudyId, fromDate, toDate);
766
767 } else if (clinicalSummaryType == 3) {
768 //Draw 5 Circles
769 $('#boxStatisticsCircles').show();
770 $('.boxStatisticsNumbering').hide();
771 studyTotalEvents = parseInt(result.d[0]) + parseInt(result.d[1]) + parseInt(result.d[2]) + parseInt(result.d[3]) + parseInt(result.d[4]) + parseInt(result.d[5]);
772 $('#txtTotalEventsInCircles').val(studyTotalEvents);
773
774 //Draw the circle for the total events
775 totalEventsChart = DrawCircleChart('Total Events', 'containerTotalEventsCircle', 100, 'rgb(0,53,255)');
776
777 //Draw the circle for the Patient Triggered Events events
778 ptEventsChart = DrawCircleChart('PT Events', 'containerPTEventsCircle', (parseInt(result.d[0]) + parseInt(result.d[1])) * 100 / studyTotalEvents, 'rgb(0,176,240)');
779
780 //Draw the circle for the Pause events
781 PauseEventsChart = DrawCircleChart('Pause Events', 'containerPauseEventsCircle', parseInt(result.d[5]) * 100 / studyTotalEvents, 'rgb(0,53,52)');
782
783 //Draw the circle for the brady events
784 bradyEventsChart = DrawCircleChart('Brady Events', 'containerBradyEventsCircle', parseInt(result.d[3]) * 100 / studyTotalEvents, 'rgb(255,0,153)');
785
786 //Draw the circle for the Tachy events
787 tachyEventsChart = DrawCircleChart('Tachy Events', 'containerTachyEventsCircle', parseInt(result.d[4]) * 100 / studyTotalEvents, 'rgb(153,51,153)');
788
789 //Draw the circle for the AF events
790 aFEventsChart = DrawCircleChart('AF Events', 'containerAFEventsCircle', parseInt(result.d[2]) * 100 / studyTotalEvents, 'rgb(255,102,51)');
791
792 }
793 if ($('#hfSavedEventId').val() == -1) {
794 if (hrCalculationEvents == false) {
795 setStudyClinicalHRValues();
796 }
797 }
798
799 //currentUTCHour = result.d[11];
800 currentUTCHour = (moment.tz(fromDate, timeZone).utcOffset()) / 60;
801
802 },
803 error: function () {
804 },
805 failure: function () {
806 }
807 });
808 var para = '{"studyId":"' + currentStudyId + '","startingDate":"' + fromDate + '","endDate":"' + toDate + '","includeStrips":"' + stripsIncluded + '","reportType":"' + reportType + '","hrValuesAsRange":"' + (hrMeasurementValues == 'Range') + '"}';
809
810 $.ajax({
811 url: '<%=ResolveUrl("~/User/Services/WebServices.asmx/GetStudyReportEvents") %>',
812 data: para,
813 dataType: "json",
814 type: "POST",
815 contentType: "application/json;",
816 success: function (returnedEvents) {
817
818 if (returnedEvents.d.length > 0) {
819 $('#btnCreateReport').prop("disabled", false);
820 }
821
822 includedEvents = [];
823 let allHrData = [];
824
825 $("#EventsResult").empty();
826 if (returnedEvents.d.length > 0) {
827 //hide the empty list messsage
828 $("lblEmptylist").css("display", "block");
829
830 $("#tmplEvent").tmpl(returnedEvents.d).appendTo($("#EventsResult"));
831
832
833 if (!currentLoopIsOver) {
834
835 setTimeout(function () { currentLoop.break(true) }, 100);
836 }
837 currentLoop = syncLoop(returnedEvents.d.length, function (loop) {
838 currentLoopIsOver = false;
839 currentLoop = setTimeout(function () {
840 var i = loop.iteration();
841 $("#tmplEventTypes").tmpl(allEventTypes).appendTo("#slctEventActualDescription_" + returnedEvents.d[i].EventId + "_" + returnedEvents.d[i].StripId);
842 $("#slctEventActualDescription_" + returnedEvents.d[i].EventId + "_" + returnedEvents.d[i].StripId).select2({
843 allowClear: false
844 });
845 $("#slctEventActualDescription_" + returnedEvents.d[i].EventId + "_" + returnedEvents.d[i].StripId).on("select2-open", function () {
846 $('.select2-drop').css({ zoom: '100%' });
847 });
848 $("#slctEventActualDescription_" + returnedEvents.d[i].EventId + "_" + returnedEvents.d[i].StripId).on("select2-close", function () {
849 $('.select2-drop').css({ zoom: '' });
850 });
851
852 $("#slctEventActualDescription_" + returnedEvents.d[i].EventId + "_" + returnedEvents.d[i].StripId).select2("val", returnedEvents.d[i].EventName);
853 includedEvents.push(returnedEvents.d[i].EventId + '_' + returnedEvents.d[i].StripId + '/In');
854 $('#btnIncludedInReport_' + returnedEvents.d[i].EventId + "_" + returnedEvents.d[i].StripId).click(function (e) {
855 e.preventDefault();
856 ExcludeFromReport(parseInt($(this).context.id.split('_')[1]), parseInt($(this).context.id.split('_')[2]), returnedEvents.d[i].Type);
857 return false;
858 });
859 GetImage(returnedEvents.d[i].EventId, returnedEvents.d[i].Type, returnedEvents.d[i].ImageURL, returnedEvents.d[i].StripId);
860 if (hasAnonymFeature == true) {
861 if (isSales == false && isProvider == false) {
862 $(".commentsButton").css('display', 'block');
863 }
864
865 }
866
867 if (hrCalculationEvents == true) {
868 if (hrMeasurementValues == 'Range') {
869 //if (returnedEvents.d[i].StripId == 0) {
870
871 let hrRange = returnedEvents.d[i].Rate;
872 let avgHR = returnedEvents.d[i].AVGRate;
873 let date = returnedEvents.d[i].EventDate;
874
875 addHRValuesToArray(hrRange, avgHR, date, allHrData);
876 // }
877 }
878 else {
879 let val = parseInt(returnedEvents.d[i].Rate);
880 let date = returnedEvents.d[i].EventDate
881 if (!Number.isNaN(val)) {
882
883 let ev = {
884 val: val,
885 date: date
886 }
887 allHrData.push(ev);
888 }
889 }
890 }
891 loop.next();
892 }, 100);
893
894
895 }, function () {
896 currentLoopIsOver = true;
897
898 if (hrCalculationEvents == true) {
899 if (hrMeasurementValues == 'Range') {
900 calculateHRValuesWithRange(allHrData);
901 return;
902 }
903 if (allHrData.length != 0) {
904 minHREvents = allHrData[0].val;
905 minHREventsDate = allHrData[0].date
906 maxHREvents = allHrData[0].val;
907 maxHREventsDate = allHrData[0].date
908 avgHREvents = 0;
909
910 for (var i = 0; i < allHrData.length; i++) {
911 if (allHrData[i].val > maxHREvents) {
912 maxHREvents = allHrData[i].val;
913 maxHREventsDate = allHrData[i].date;
914 }
915
916 if (allHrData[i].val < minHREvents) {
917 minHREvents = allHrData[i].val;
918 minHREventsDate = allHrData[i].date;
919 }
920 avgHREvents += allHrData[i].val;
921 }
922
923 avgHREvents = avgHREvents / allHrData.length;
924
925 $('#txtMaxHR').val(maxHREvents);
926 $('#txtMinHR').val(minHREvents);
927 $('#txtAvgHR').val(parseInt(avgHREvents));
928
929 $('#txtMaxHRDate').val(maxHREventsDate);
930 $('#txtMinHRDate').val(minHREventsDate);
931
932 } else {
933 minHREvents = 0;
934 maxHREvents = 0;
935 avgHREvents = 0;
936
937 $('#txtMaxHR').val(maxHREvents);
938 $('#txtMinHR').val(minHREvents);
939 $('#txtAvgHR').val(parseInt(avgHREvents));
940 }
941
942 setStudyClinicalHRValues();
943 }
944
945 });
946 } else {
947 //Show the empty list messsage
948 $("#EventsResult").append('<label id="lblEmptyList" style="display:block;width:100%;text-align:center;">No events were found on the selected date range</label>');
949 }
950
951
952 },
953 error: function () {
954 },
955 failure: function () {
956 }
957 });
958 }
959 }
960
961 function GetImage(eventId, eventType, imageUrl, stripId) {
962
963
964 if ($("#theImg_" + eventId + "_" + stripId).length) {
965 $("#theImg_" + eventId + "_" + stripId).remove();
966 }
967 var path = "";
968 if (eventType == "Event") {
969 path = currentStudyId + "/ecg/" + eventId + "R_" + eventDuration + '.gif';
970 }
971 else {
972 path = imageUrl;
973 }
974
975 var parametersSas = '{"path":"' + path + '","studyId":"' + currentStudyId + '","eventId":"' + eventId + '"}';
976
977 $.ajax({
978 url: '<%=ResolveUrl("~/User/Services/WebServices.asmx/GetBlobSas") %>',
979 data: parametersSas,
980 dataType: "json",
981 type: "POST",
982 async: false,
983 contentType: "application/json;",
984 success: function (message) {
985 var success = message.d;
986 var imgSrc = success;
987
988 $('#Container_' + eventId + "_" + stripId).prepend('<img id="theImg_' +
989 eventId + '_' + stripId +
990 '" style="max-width:100%;height:auto;" src="' +
991 imgSrc +
992 '" />')
993
994 }
995 });
996 }
997
998
999 function ExcludeFromReport(eventId, stripId, eventType) {
1000
1001
1002 var currentEventIndexIn = includedEvents.indexOf(eventId + '_' + stripId + '/In');
1003 //Checking if the event exists in the array of events included in the report
1004 if (currentEventIndexIn > -1) {
1005
1006 includedEvents[currentEventIndexIn] = includedEvents[currentEventIndexIn].replace('In', 'Out');
1007 $('#btnIncludedInReport_' + eventId + '_' + stripId).removeClass('event-included');
1008 $('#btnIncludedInReport_' + eventId + '_' + stripId).addClass('event-excluded');
1009 } else {
1010 var currentEventIndexOut = includedEvents.indexOf(eventId + '_' + stripId + '/Out');
1011 if (currentEventIndexOut > -1) {
1012 includedEvents[currentEventIndexOut] = includedEvents[currentEventIndexOut].replace('Out', 'In');
1013 $('#btnIncludedInReport_' + eventId + '_' + stripId).removeClass('event-excluded');
1014 $('#btnIncludedInReport_' + eventId + '_' + stripId).addClass('event-included');
1015
1016 }
1017 }
1018
1019 if (hrCalculationEvents == true) {
1020 let allHrData = [];
1021 for (var i = 0; i < includedEvents.length; i++) {
1022 var currentEvent;
1023 var currentStrip;
1024 currentEvent = includedEvents[i].split('_');
1025 currentStrip = currentEvent[1].split('/');
1026 if (currentStrip[1] == 'In') {
1027 let date = $('#txtEventDate_' + currentEvent[0] + '_' + currentStrip[0]).val();
1028 if (hrMeasurementValues == 'Range') {
1029 //if (currentStrip[0] != 0)
1030 // continue;
1031 let hrRange = $('#txtRate_' + currentEvent[0] + '_' + currentStrip[0]).val();
1032 let avgHR = $('#txtRate_' + currentEvent[0] + '_' + currentStrip[0]).attr('data-avg-rate');
1033
1034 addHRValuesToArray(hrRange, avgHR, date, allHrData);
1035 continue;
1036 }
1037 let val = parseInt($('#txtRate_' + currentEvent[0] + '_' + currentStrip[0]).val());
1038 if (!Number.isNaN(val)) {
1039 let ev = {
1040 val: val,
1041 date: date
1042 }
1043 allHrData.push(ev);
1044 }
1045 }
1046 }
1047 if (hrMeasurementValues == 'Range') {
1048 calculateHRValuesWithRange(allHrData);
1049 return;
1050 }
1051
1052 if (allHrData.length != 0) {
1053 minHREvents = allHrData[0].val;
1054 minHREventsDate = allHrData[0].date
1055 maxHREvents = allHrData[0].val;
1056 maxHREventsDate = allHrData[0].date
1057 avgHREvents = 0;
1058
1059 for (var i = 0; i < allHrData.length; i++) {
1060 if (allHrData[i].val > maxHREvents) {
1061 maxHREvents = allHrData[i].val;
1062 maxHREventsDate = allHrData[i].date;
1063 }
1064
1065 if (allHrData[i].val < minHREvents) {
1066 minHREvents = allHrData[i].val;
1067 minHREventsDate = allHrData[i].date;
1068 }
1069
1070 avgHREvents += allHrData[i].val;
1071 }
1072
1073
1074 avgHREvents = avgHREvents / allHrData.length;
1075
1076 $('#txtMaxHR').val(maxHREvents);
1077 $('#txtMinHR').val(minHREvents);
1078 $('#txtAvgHR').val(parseInt(avgHREvents));
1079
1080
1081 $('#txtMaxHRDate').val(maxHREventsDate);
1082 $('#txtMinHRDate').val(minHREventsDate);
1083
1084 } else {
1085 minHREvents = 0;
1086 maxHREvents = 0;
1087 avgHREvents = 0;
1088
1089 $('#txtMaxHR').val(maxHREvents);
1090 $('#txtMinHR').val(minHREvents);
1091 $('#txtAvgHR').val(parseInt(avgHREvents));
1092 }
1093
1094 setStudyClinicalHRValues();
1095 }
1096 }
1097 function SaveReport() {
1098
1099 $('#notesDialog').dialog('destroy').remove();
1100 $('#eventNotesDialogue').dialog('destroy').remove();
1101
1102 $("#dlgNoteNoHR").dialog('close');
1103 $('#imgReportInProgress').css('display', 'block');
1104 var finalIncludedEvents = [];
1105 var finalIncludedStrips = [];
1106 var finalExcludedEvents = [];
1107 var finalExcludedStrips = [];
1108 var includedEventNames = [];
1109 var includedEventDates = [];
1110 var includedEventsComments = [];
1111 var includedEventsSVG = [];
1112 var includedEventsTypes = [];
1113 var includedEventsRates = [];
1114 var changes = {}; // creating an object to save all changes
1115
1116 var includedEventsLength = 0;
1117
1118 for (var i = 0; i < includedEvents.length; i++) {
1119
1120
1121
1122 var currentEvent;
1123 var currentStrip;
1124 currentEvent = includedEvents[i].split('_');
1125 currentStrip = currentEvent[1].split('/');
1126
1127 if (currentStrip[1] == 'In' && currentStrip[0] == "0") {
1128 let includedEvent = {};
1129 includedEventsLength++;
1130 includedEvent.id = parseInt(currentEvent[0]);
1131 includedEvent.noSVG = "NOSVG";
1132 includedEvent.actualDescription = $('#slctEventActualDescription_' + currentEvent[0] + '_' + currentStrip[0]).val();
1133 includedEvent.date = $('#txtEventDate_' + currentEvent[0] + '_' + currentStrip[0]).val();
1134 includedEvent.comment = $('#txtComment_' + currentEvent[0] + '_' + currentStrip[0]).val();
1135 includedEvent.type = $('#ddlEventType_' + currentEvent[0] + '_' + currentStrip[0]).val();
1136
1137 includedEvent.rate = parseInt($('#txtRate_' + currentEvent[0] + '_' + currentStrip[0]).val());
1138
1139 if (includedEvent.rate === undefined || includedEvent.rate === null || includedEvent.rate === "" || includedEvent.rate == "N/A" || isNaN(includedEvent.rate))
1140 includedEvent.rate = 0;
1141 finalIncludedEvents.push(includedEvent);
1142
1143 } else
1144 if (currentStrip[1] == 'In' && currentStrip[0] != "0") {
1145 let includedEStrip = {};
1146 includedEventsLength++;
1147 includedEStrip.id = parseInt(currentStrip[0]);
1148 includedEStrip.noSVG = "NOSVG";
1149 includedEStrip.actualDescription = $('#slctEventActualDescription_' + currentEvent[0] + '_' + currentStrip[0]).val();
1150 includedEStrip.date = $('#txtEventDate_' + currentEvent[0] + '_' + currentStrip[0]).text();
1151 includedEStrip.comment = $('#txtComment_' + currentEvent[0] + '_' + currentStrip[0]).val();
1152 includedEStrip.type = $('#ddlEventType_' + currentEvent[0] + '_' + currentStrip[0]).val();
1153 includedEStrip.rate = parseInt($('#txtRate_' + currentEvent[0] + '_' + currentStrip[0]).val());
1154
1155 if (includedEStrip.rate === undefined || includedEStrip.rate === null || includedEStrip.rate === "" || includedEStrip.rate == "N/A" || isNaN(includedEStrip.rate))
1156 includedEStrip.rate = 0;
1157 finalIncludedStrips.push(includedEStrip);
1158 }
1159
1160 else
1161 if (currentStrip[1] == 'Out' && currentStrip[0] == "0") {
1162 finalExcludedEvents.push(parseInt(currentEvent[0]));
1163 } else {
1164 finalExcludedStrips.push(currentStrip[0]);
1165 }
1166
1167 }
1168
1169 if (includedEventsLength <= 0) {
1170 $("#dlgNoteNoEvents").dialog('open');
1171 return;
1172 }
1173
1174 var minOHREventsCount = 0;
1175 var maxOHREventsCount = 0;
1176 var minAFEventsCount = 0;
1177 var maxAFEventsCount = 0;
1178 for (var i = 0; i < includedEvents.length; i++) {
1179 var type = includedEvents[i].type;
1180 if (type == "MinOHR") {
1181 minOHREventsCount++;
1182 } if (type == "MaxOHR") {
1183 maxOHREventsCount++;
1184 } if (type == "MinAFHR") {
1185 minAFEventsCount++;
1186 } if (type == "MaxAFHR") {
1187 maxAFEventsCount++;
1188 }
1189 }
1190
1191 if (minOHREventsCount > 1 || maxOHREventsCount > 1 || minAFEventsCount > 1 || maxAFEventsCount > 1) {
1192 if (minOHREventsCount > 1) {
1193 $('#dlgOverRateDefinedEvents1').html("<b><big>" + minOHREventsCount + " </b></big> Min. Overall Heart Rate Events");
1194 } else {
1195 $('#dlgOverRateDefinedEvents1').html("");
1196 }
1197 if (maxOHREventsCount > 1) {
1198 $('#dlgOverRateDefinedEvents2').html("<b><big>" + maxOHREventsCount + " </b></big> Max. Overall Heart Rate Events");
1199 } else {
1200 $('#dlgOverRateDefinedEvents2').html("");
1201 }
1202 if (minAFEventsCount > 1) {
1203 $('#dlgOverRateDefinedEvents3').html("<b><big>" + minAFEventsCount + "</b></big> Min. AF Rate Events");
1204 } else {
1205 $('#dlgOverRateDefinedEvents3').html("");
1206 }
1207 if (maxAFEventsCount > 1) {
1208 $('#dlgOverRateDefinedEvents4').html("<b><big>" + maxAFEventsCount + "</b></big> Max. AF Rate Events");
1209 } else {
1210 $('#dlgOverRateDefinedEvents4').html("");
1211 }
1212 $("#dlgOverRateDefinedEvents").dialog('open');
1213 return;
1214 }
1215
1216 if (HRIncluded) {
1217 includedEventsSVG.push(HRChart == undefined ? ("HR:" + null) : ("HR:" + encodeURIComponent(HRChart.getSVG())));
1218 }
1219
1220 if (burdenGraphIncluded) {
1221
1222 includedEventsSVG.push(ArrChart == undefined ? ("AF:" + null) : ("AF:" + encodeURIComponent(ArrChart.getSVG())));
1223 }
1224
1225 if (clinicalSummaryType == 2) {
1226 includedEventsSVG.push(PieChart == undefined ? ("Pie:" + null) : ("Pie:" + encodeURIComponent(PieChart.getSVG())));
1227 } else if (clinicalSummaryType == 3) {
1228 totalEventsChart = $('#containerTotalEventsCircle').highcharts();
1229 includedEventsSVG.push(totalEventsChart == undefined ? ("totalEventsChart:" + null) : ("totalEventsChart:" + encodeURIComponent(totalEventsChart.getSVG())));
1230 PauseEventsChart = $('#containerPauseEventsCircle').highcharts();
1231 includedEventsSVG.push(PauseEventsChart == undefined ? ("PauseEventsChart:" + null) : ("PauseEventsChart:" + encodeURIComponent(PauseEventsChart.getSVG())));
1232 bradyEventsChart = $('#containerBradyEventsCircle').highcharts();
1233 includedEventsSVG.push(bradyEventsChart == undefined ? ("bradyEventsChart:" + null) : ("bradyEventsChart:" + encodeURIComponent(bradyEventsChart.getSVG())));
1234 tachyEventsChart = $('#containerTachyEventsCircle').highcharts();
1235 includedEventsSVG.push(tachyEventsChart == undefined ? ("tachyEventsChart:" + null) : ("tachyEventsChart:" + encodeURIComponent(tachyEventsChart.getSVG())));
1236 aFEventsChart = $('#containerAFEventsCircle').highcharts();
1237 includedEventsSVG.push(aFEventsChart == undefined ? ("aFEventsChart:" + null) : ("aFEventsChart:" + encodeURIComponent(aFEventsChart.getSVG())));
1238 ptEventsChart = $('#containerPTEventsCircle').highcharts();
1239 includedEventsSVG.push(totalEventsChart == undefined ? ("ptEventsChart:" + null) : ("ptEventsChart:" + encodeURIComponent(ptEventsChart.getSVG())));
1240
1241 }
1242
1243 changes.customPatientName = $('#txtCustomPatientName').val();
1244 changes.customProviderName = $('#txtCustomProviderName').val();
1245 changes.findings = ($('#txtFindings').val());
1246 changes.physInterpretation = ($('#txtPhysInterpretation').val());
1247
1248 //Study end date
1249 changes.studyEndDate = ($('#txtReportStudyEndTime').val()); //[7] The study end time
1250 changes.burdenGraphIncluded = (burdenGraphIncluded);//[8] Boolean that holds the value of including or excluding the HR & Burden graphs
1251 //New Variables For AMI
1252 var valid = true;
1253 if (clinicalSummaryType == 1) {
1254 if (!$('#txtSymptomatic').valid()) {
1255 valid = false;
1256 }
1257
1258 if (!$('#txtAsymptomatic').valid()) {
1259 valid = false;
1260 }
1261
1262 if (!$('#txtAF').valid()) {
1263 valid = false;
1264 }
1265
1266 if (!$('#txtTachy').valid()) {
1267 valid = false;
1268 }
1269
1270 if (!$('#txtBrady').valid()) {
1271 valid = false;
1272 }
1273
1274 if (!$('#txtPause').valid()) {
1275 valid = false;
1276 }
1277
1278 } else {
1279 valid = true;
1280 }
1281
1282
1283 //Push the values anyway even if they're empty for the Wireless Event type of reports where they're not used but we should keep the order
1284 changes.symptomatic = ($('#txtSymptomatic').val());//[9] Number of PT with Symptoms
1285 changes.asymptomatic = ($('#txtAsymptomatic').val());//[10] Number of PT with no Symptoms
1286 changes.af = ($('#txtAF').val());//[11] Number of AF
1287 changes.tachy = ($('#txtTachy').val());//[12] Number of Tachy
1288 changes.brady = ($('#txtBrady').val());//[13] Number of Brady
1289 changes.pause = ($('#txtPause').val());//[14] Number of Pause
1290
1291 if (valid) {
1292 changes.minHR = ($('#txtMinHR').val());//[15] Min HR
1293 changes.maxHR = ($('#txtMaxHR').val());//[16] Max HR
1294 changes.avgHR = ($('#txtAvgHR').val());//[17] Avg HR
1295 if ($('#txtMinHRDate').val() != '') {
1296 if (ValidateDateTime($('#txtMinHRDate').val())) {
1297 changes.minHRDate = ($('#txtMinHRDate').val());//[18] Min HRDate
1298 $('#txtMinHRDate').removeClass("error");
1299 } else {
1300 $('#txtMinHRDate').addClass("error");
1301 $('#txtMinHRDate').focus();
1302 $('#txtMinHRDate').tooltipster({
1303 trigger: 'hover',
1304 onlyOne: false,
1305 position: 'right',
1306 enable: true,
1307 content: 'Please fill a valid date and time in format: mm/dd/yyyy HH:mm:ss'
1308
1309 });
1310 return;
1311 }
1312 } else {
1313 changes.minHRDate = ($('#txtMinHRDate').val());//[18] Min HRDate
1314 }
1315
1316 if ($('#txtMaxHRDate').val() != '') {
1317 if (ValidateDateTime($('#txtMaxHRDate').val())) {
1318 changes.maxHRDate = ($('#txtMaxHRDate').val());//[19] Min HRDate
1319 $('#txtMaxHRDate').removeClass("error");
1320 } else {
1321 $('#txtMaxHRDate').addClass("error");
1322 $('#txtMaxHRDate').tooltipster({
1323 trigger: 'hover',
1324 onlyOne: false,
1325 enable: true,
1326 position: 'right',
1327 content: 'Please fill a valid date and time in format: mm/dd/yyyy HH:mm:ss'
1328
1329 });
1330 $('#txtMaxHRDate').focus();
1331 return;
1332 }
1333 } else {
1334 changes.maxHRDate = ($('#txtMaxHRDate').val());//[19] Min HRDate
1335 }
1336
1337 if ($('#txtReportStudyStartTime').valid() && $('#txtReportStudyEndTime').valid()) {
1338 changes.reportStudyStartTime = ($('#txtStudyStartingDate').val());//[20] Study Start Time
1339 if (reportType == "DailyReport") {
1340 //In the backend it won't be taken into consideration
1341 changes.ReportStudyEndTime = ($('#txtReportStudyEndTime').val());//[21] Study End Time since daily report do not have report end time
1342 }
1343 else {
1344 changes.ReportStudyEndTime = ($('#txtStudyEndDate').val());//[21] Study End Time
1345 }
1346
1347 if (clinicalSummaryType == 2 || clinicalSummaryType == 3) {
1348 changes.studyTotalEvents = (studyTotalEvents); //[22] Study Total Number of Events
1349 }
1350 appInsights.trackEvent("Created Weekly Report");
1351
1352 if (HRChart != null) {
1353 var maxHRVisibility = HRChart.series[0].visible;
1354 var avgHRVisibility = HRChart.series[1].visible;
1355 var minHRVisibility = HRChart.series[2].visible;
1356 var hrGping = $('#selectReportRDG').val();
1357 }
1358
1359 if (ArrChart != null) {
1360 var monitoredHrsVisibility = ArrChart.series[0].visible;
1361 var tachyBurdenVisibility = ArrChart.series[1].visible;
1362 var bradyBurdenVisibility = ArrChart.series[2].visible;
1363 var afBurdenVisibility = ArrChart.series[4].visible;
1364 }
1365
1366
1367
1368
1369
1370 if (changes.burdenGraphIncluded === undefined || changes.burdenGraphIncluded === null || changes.burdenGraphIncluded === "") {
1371 burdenGraphIncluded = false;
1372 }
1373 if (maxHRVisibility === undefined || maxHRVisibility === null || maxHRVisibility === "") {
1374 maxHRVisibility = false;
1375 }
1376 if (avgHRVisibility === undefined || avgHRVisibility === null || avgHRVisibility === "") {
1377 avgHRVisibility = false;
1378 }
1379 if (minHRVisibility === undefined || minHRVisibility === null || minHRVisibility === "") {
1380 minHRVisibility = false;
1381 }
1382 if (monitoredHrsVisibility === undefined || monitoredHrsVisibility === null || monitoredHrsVisibility === "") {
1383 monitoredHrsVisibility = false;
1384 }
1385 if (tachyBurdenVisibility === undefined || tachyBurdenVisibility === null || tachyBurdenVisibility === "") {
1386 tachyBurdenVisibility = false;
1387 }
1388 if (afBurdenVisibility === undefined || afBurdenVisibility === null || afBurdenVisibility === "") {
1389 afBurdenVisibility = false;
1390 }
1391 if (changes.symptomatic === undefined || changes.symptomatic === null || changes.symptomatic === "") {
1392 changes.symptomatic = 0;
1393 }
1394 if (changes.asymptomatic === undefined || changes.asymptomatic === null || changes.asymptomatic === "") {
1395 changes.asymptomatic = 0;
1396 }
1397 if (changes.af === undefined || changes.af === null || changes.af === "") {
1398 changes.af = 0;
1399 }
1400 if (changes.tachy === undefined || changes.tachy === null || changes.tachy === "") {
1401 changes.tachy = 0;
1402 }
1403 if (changes.brady === undefined || changes.brady === null || changes.brady === "") {
1404 changes.brady = 0;
1405 }
1406 if (changes.pause === undefined || changes.pause === null || changes.pause === "") {
1407 changes.pause = 0;
1408 }
1409
1410 if (changes.maxHR === undefined || changes.maxHR === null || changes.maxHR === "") {
1411 changes.maxHR = 0;
1412 }
1413
1414 if (changes.avgHR === undefined || changes.avgHR === null || changes.avgHR === "") {
1415 changes.avgHR = 0;
1416 }
1417 if (changes.minHRDate === undefined || changes.minHRDate === null || changes.minHRDate === "") {
1418 changes.minHRDate = changes.reportStudyStartTime;
1419 }
1420 if (changes.maxHRDate === undefined || changes.maxHRDate === null || changes.maxHRDate === "") {
1421 changes.maxHRDate = changes.ReportStudyEndTime;
1422 }
1423 if (bradyBurdenVisibility === undefined || bradyBurdenVisibility === null || bradyBurdenVisibility === "") {
1424 bradyBurdenVisibility = false;
1425 }
1426
1427 if (hrGping === undefined || hrGping === null || hrGping === "") {
1428 hrGping = "";
1429 }
1430
1431 //for (var i = 0; i < finalIncludedEvents.length; i++) {
1432 // if (isNaN(finalExcludedEvents[i].rate)) {
1433 // finalExcludedEvents[i].rate = 0;
1434 // }
1435 //}
1436
1437 //for (var i = 0; i < finalIncludedStrips.length; i++) {
1438 // if (isNaN(finalIncludedStrips[i].rate)) {
1439 // finalIncludedStrips[i].rate = 0;
1440 // }
1441 //}
1442
1443
1444
1445 var x = $('#hfSavedEventId').val();
1446
1447 var reportId = "";
1448 switch (reportType) {
1449 case "EOSReport":
1450 reportId = "EOS_";
1451 break;
1452 case "WeeklyReport":
1453 reportId = "WR_";
1454 break;
1455 case "DailyReport":
1456 reportId = "DR_";
1457 break;
1458 default:
1459 reportId = "EOS_";
1460 break;
1461 }
1462 $.ajax({
1463 url: '<%=ResolveUrl("~/User/Services/WebServices.asmx/SaveReport") %>',
1464
1465 data: JSON.stringify({
1466
1467 reportId: reportId,
1468 txtCustomPatientId: parseInt(patientId),
1469 txtCustomProviderId: parseInt(providerId),
1470 txtFindings: changes.findings,
1471 txtPhysInterpretation: changes.physInterpretation,
1472 //Study End Time (we do not care about it)
1473 txtStudyEndDate: changes.studyEndDate,
1474 burdenGraphIncluded: changes.burdenGraphIncluded,
1475 txtSymptomatic: parseInt(changes.symptomatic),
1476 txtAsymptomatic: parseInt(changes.asymptomatic),
1477 txtAF: parseInt(changes.af),
1478 txtTachy: parseInt(changes.tachy),
1479 txtBrady: parseInt(changes.brady),
1480 txtPause: parseInt(changes.pause),
1481 txtMinHR: parseInt(changes.minHR),
1482 txtMaxHR: parseInt(changes.maxHR),
1483 txtAvgHR: parseInt(changes.avgHR),
1484 txtMinHRDate: changes.minHRDate,
1485 txtMaxHRDate: changes.maxHRDate,
1486 //Report start and end time
1487 txtReportStudyStartTime: changes.reportStudyStartTime,
1488 txtReportStudyEndTime: changes.ReportStudyEndTime,
1489 studyTotalEvents: 0,
1490 studyId: currentStudyId,
1491 maxHRVisibility: maxHRVisibility,
1492 avgHRVisibility: avgHRVisibility,
1493 minHRVisibility: minHRVisibility,
1494 hrGping: hrGping,
1495 monitoredHrsVisibility: monitoredHrsVisibility,
1496 tachyBurdenVisibility: tachyBurdenVisibility,
1497 bradyBurdenVisibility: bradyBurdenVisibility,
1498 afBurdenVisibility: afBurdenVisibility,
1499 finalExcludedEvents: finalExcludedEvents,
1500 includedEv: finalIncludedEvents,
1501 finalExcludedStrips: finalExcludedStrips,
1502 includedStrips: finalIncludedStrips,
1503 savedReportId: $('#hfSavedEventId').val(),
1504 pvcCount: 0,
1505 totalBeatsCount: 0,
1506 createClicked: $("#hfCreateClicked").val()
1507 }),
1508
1509 dataType: "json",
1510 type: "POST",
1511 async: false,
1512 contentType: "application/json",
1513 success: function (message) {
1514 if (message.d != "error") {
1515 $('#imgReportInProgress').css('display', 'none');
1516 returnedSavedReportId = message.d;
1517 if ($("#hfEditReport").val() != "true" && ($("#hfCreatedReportId").val() == null || $("#hfCreatedReportId").val() == "null") && $("#hfCreateClicked").val() != "true") {
1518 $.gritter.add({
1519 title: 'New Report Saved!',
1520 text: 'A new report for one of your patients has been saved!',
1521 class_name: 'gritter-light'
1522 });
1523 }
1524 else {
1525 GenerateReport();
1526 }
1527
1528 $('#notesDialog').dialog('destroy').remove();
1529 $('#eventNotesDialogue').dialog('destroy').remove();
1530 } else {
1531 $.gritter.add({
1532 title: 'Attention!',
1533 text: 'Please refresh and try again.</br></br>If problem persists, please contact your service provider.',
1534 class_name: 'gritter-light'
1535 });
1536 }
1537 }, error: function (error) {
1538 console.log(error.responseText);
1539 }
1540 });
1541
1542 } else {
1543 $('#txtReportStudyStartTime').focus();
1544 }
1545
1546 } else {
1547 $('#txtSymptomatic').focus();
1548 }
1549 }
1550
1551 function GenerateReportFromConfirmPopup() {
1552 $("#hfCreateClicked").val("true");
1553 $("#hfEditReport").val("false");
1554 SaveReport();
1555 }
1556
1557 function GenerateReport() {
1558
1559 $('#notesDialog').dialog('destroy').remove();
1560
1561 $("#dlgNoteNoHR").dialog('close');
1562 $('#imgReportInProgress').css('display', 'block');
1563 var finalIncludedEvents = [];
1564 var finalIncludedStrips = [];
1565 var fincalExcludedEvents = [];
1566 var finalExcludedStrips = [];
1567 var includedEventNames = [];
1568 var includedEventDates = [];
1569 var includedEventsComments = [];
1570 var excludedEventNames = [];
1571 var excludedEventRates = [];
1572 var excludedEventsComments = [];
1573 var includedEventsSVG = [];
1574 includedEventsTypes = [];
1575 includedEventsRates = [];
1576
1577 var includedEventsLength = 0;
1578
1579 for (var i = 0; i < includedEvents.length; i++) {
1580
1581 var currentEvent;
1582 var currentStrip;
1583 currentEvent = includedEvents[i].split('_');
1584 currentStrip = currentEvent[1].split('/');
1585 if (currentStrip[1] == 'In') {
1586 try {
1587 includedEventsLength++;
1588 finalIncludedEvents.push(parseInt(currentEvent[0]));
1589 finalIncludedStrips.push(parseInt(currentStrip[0]));
1590 includedEventsSVG.push(currentEvent[0] + ":" + "NOSVG");
1591 includedEventNames.push(currentEvent[0] + '_' + currentStrip[0] + ":" + $('#slctEventActualDescription_' + currentEvent[0] + '_' + currentStrip[0]).val());
1592 includedEventDates.push(currentEvent[0] + ":" + $('#txtEventDate_' + currentEvent[0] + '_' + currentStrip[0]).text());
1593 includedEventsComments.push(currentEvent[0] + '_' + currentStrip[0] + ":" + $('#txtComment_' + currentEvent[0] + '_' + currentStrip[0]).val());
1594 includedEventsTypes.push(currentEvent[0] + ":" + $('#ddlEventType_' + currentEvent[0] + '_' + currentStrip[0]).val());
1595 includedEventsRates.push(currentEvent[0] + '_' + currentStrip[0] + ":" + $('#txtRate_' + currentEvent[0] + '_' + currentStrip[0]).val());
1596 } catch (error) {
1597 }
1598 }
1599 if (currentStrip[1] == 'Out') {
1600 fincalExcludedEvents.push(parseInt(currentEvent[0]));
1601 finalExcludedStrips.push(parseInt(currentStrip[0]));
1602 excludedEventNames.push(currentEvent[0] + "_" + currentStrip[0] + ":" + $('#slctEventActualDescription_' + currentEvent[0] + '_' + currentStrip[0]).val());
1603 excludedEventRates.push(currentEvent[0] + '_' + currentStrip[0] + ":" + $('#txtRate_' + currentEvent[0] + '_' + currentStrip[0]).val());
1604 excludedEventsComments.push(currentEvent[0] + '_' + currentStrip[0] + ":" + $('#txtComment_' + currentEvent[0] + '_' + currentStrip[0]).val());
1605 }
1606
1607 }
1608
1609 if (includedEventsLength <= 0) {
1610 $("#dlgNoteNoEvents").dialog('open');
1611 return;
1612 }
1613
1614 var minOHREventsCount = 0;
1615 var maxOHREventsCount = 0;
1616 var minAFEventsCount = 0;
1617 var maxAFEventsCount = 0;
1618 for (var i = 0; i < includedEventsTypes.length; i++) {
1619 var type = includedEventsTypes[i].split(':')[1];
1620 if (type == "MinOHR") {
1621 minOHREventsCount++;
1622 } if (type == "MaxOHR") {
1623 maxOHREventsCount++;
1624 } if (type == "MinAFHR") {
1625 minAFEventsCount++;
1626 } if (type == "MaxAFHR") {
1627 maxAFEventsCount++;
1628 }
1629 }
1630
1631 if (minOHREventsCount > 1 || maxOHREventsCount > 1 || minAFEventsCount > 1 || maxAFEventsCount > 1) {
1632 if (minOHREventsCount > 1) {
1633 $('#dlgOverRateDefinedEvents1').html("<b><big>" + minOHREventsCount + " </b></big> Min. Overall Heart Rate Events");
1634 } else {
1635 $('#dlgOverRateDefinedEvents1').html("");
1636 }
1637 if (maxOHREventsCount > 1) {
1638 $('#dlgOverRateDefinedEvents2').html("<b><big>" + maxOHREventsCount + " </b></big> Max. Overall Heart Rate Events");
1639 } else {
1640 $('#dlgOverRateDefinedEvents2').html("");
1641 }
1642 if (minAFEventsCount > 1) {
1643 $('#dlgOverRateDefinedEvents3').html("<b><big>" + minAFEventsCount + "</b></big> Min. AF Rate Events");
1644 } else {
1645 $('#dlgOverRateDefinedEvents3').html("");
1646 }
1647 if (maxAFEventsCount > 1) {
1648 $('#dlgOverRateDefinedEvents4').html("<b><big>" + maxAFEventsCount + "</b></big> Max. AF Rate Events");
1649 } else {
1650 $('#dlgOverRateDefinedEvents4').html("");
1651 }
1652 $("#dlgOverRateDefinedEvents").dialog('open');
1653 return;
1654 }
1655 if (HRIncluded) {
1656 includedEventsSVG.push(HRChart == undefined ? ("HR:" + null) : ("HR:" + encodeURIComponent(HRChart.getSVG())));
1657 }
1658
1659 if (burdenGraphIncluded) {
1660 includedEventsSVG.push(ArrChart == undefined ? ("AF:" + null) : ("AF:" + encodeURIComponent(ArrChart.getSVG())));
1661 }
1662
1663 if (clinicalSummaryType == 2) {
1664 includedEventsSVG.push(PieChart == undefined ? ("Pie:" + null) : ("Pie:" + encodeURIComponent(PieChart.getSVG())));
1665 } else if (clinicalSummaryType == 3) {
1666 totalEventsChart = $('#containerTotalEventsCircle').highcharts();
1667 includedEventsSVG.push(totalEventsChart == undefined ? ("totalEventsChart:" + null) : ("totalEventsChart:" + encodeURIComponent(totalEventsChart.getSVG())));
1668 PauseEventsChart = $('#containerPauseEventsCircle').highcharts();
1669 includedEventsSVG.push(PauseEventsChart == undefined ? ("PauseEventsChart:" + null) : ("PauseEventsChart:" + encodeURIComponent(PauseEventsChart.getSVG())));
1670 bradyEventsChart = $('#containerBradyEventsCircle').highcharts();
1671 includedEventsSVG.push(bradyEventsChart == undefined ? ("bradyEventsChart:" + null) : ("bradyEventsChart:" + encodeURIComponent(bradyEventsChart.getSVG())));
1672 tachyEventsChart = $('#containerTachyEventsCircle').highcharts();
1673 includedEventsSVG.push(tachyEventsChart == undefined ? ("tachyEventsChart:" + null) : ("tachyEventsChart:" + encodeURIComponent(tachyEventsChart.getSVG())));
1674 aFEventsChart = $('#containerAFEventsCircle').highcharts();
1675 includedEventsSVG.push(aFEventsChart == undefined ? ("aFEventsChart:" + null) : ("aFEventsChart:" + encodeURIComponent(aFEventsChart.getSVG())));
1676 ptEventsChart = $('#containerPTEventsCircle').highcharts();
1677 includedEventsSVG.push(totalEventsChart == undefined ? ("ptEventsChart:" + null) : ("ptEventsChart:" + encodeURIComponent(ptEventsChart.getSVG())));
1678
1679 }
1680 var changes = [];
1681 changes.push($('#txtCustomPatientName').val());
1682 changes.push($('#txtCustomProviderName').val());
1683 changes.push($('#txtFindings').val());
1684 changes.push($('#txtPhysInterpretation').val());
1685 changes.push('');//[4] Min HR
1686 changes.push('');//[5] Max HR
1687 changes.push('');//[6] Avg HR
1688
1689 //Because report end time is removed from interface when daily report is chosen
1690 if (reportType == "DailyReport") {
1691 changes.push('');
1692 }
1693 else {
1694 changes.push($('#txtStudyEndDate').val()); //[7] The report end time specified by the user
1695 }
1696 changes.push(burdenGraphIncluded);//[8] Boolean that holds the value of including or excluding the HR & Burden graphs
1697
1698 //New Variables For AMI
1699 var valid = true;
1700 if (clinicalSummaryType == 1) {
1701 if (!$('#txtSymptomatic').valid()) {
1702 valid = false;
1703 }
1704
1705 if (!$('#txtAsymptomatic').valid()) {
1706 valid = false;
1707 }
1708
1709 if (!$('#txtAF').valid()) {
1710 valid = false;
1711 }
1712
1713 if (!$('#txtTachy').valid()) {
1714 valid = false;
1715 }
1716
1717 if (!$('#txtBrady').valid()) {
1718 valid = false;
1719 }
1720
1721 if (!$('#txtPause').valid()) {
1722 valid = false;
1723 }
1724
1725 } else {
1726 valid = true;
1727 }
1728
1729
1730 //Push the values anyway even if they're empty for the Wireless Event type of reports where they're not used but we should keep the order
1731 changes.push($('#txtSymptomatic').val());//[9] Number of PT with Symptoms
1732 changes.push($('#txtAsymptomatic').val());//[10] Number of PT with no Symptoms
1733 changes.push($('#txtAF').val());//[11] Number of AF
1734 changes.push($('#txtTachy').val());//[12] Number of Tachy
1735 changes.push($('#txtBrady').val());//[13] Number of Brady
1736 changes.push($('#txtPause').val());//[14] Number of Pause
1737
1738 if (valid) {
1739
1740 changes.push($('#txtMinHR').val());//[15] Min HR
1741 changes.push($('#txtMaxHR').val());//[16] Max HR
1742 changes.push($('#txtAvgHR').val());//[17] Avg HR
1743 if ($('#txtMinHRDate').val() != '') {
1744 if (ValidateDateTime($('#txtMinHRDate').val())) {
1745 changes.push($('#txtMinHRDate').val());//[18] Min HRDate
1746 $('#txtMinHRDate').removeClass("error");
1747 } else {
1748 $('#txtMinHRDate').addClass("error");
1749 $('#txtMinHRDate').focus();
1750 $('#txtMinHRDate').tooltipster({
1751 trigger: 'hover',
1752 onlyOne: false,
1753 position: 'right',
1754 enable: true,
1755 content: 'Please fill a valid date and time in format: mm/dd/yyyy HH:mm:ss'
1756
1757 });
1758 return;
1759 }
1760 } else {
1761 changes.push($('#txtMinHRDate').val());//[18] Min HRDate
1762 }
1763
1764
1765 if ($('#txtMaxHRDate').val() != '') {
1766 if (ValidateDateTime($('#txtMaxHRDate').val())) {
1767 changes.push($('#txtMaxHRDate').val());//[19] Min HRDate
1768 $('#txtMaxHRDate').removeClass("error");
1769 } else {
1770 $('#txtMaxHRDate').addClass("error");
1771 $('#txtMaxHRDate').tooltipster({
1772 trigger: 'hover',
1773 onlyOne: false,
1774 enable: true,
1775 position: 'right',
1776 content: 'Please fill a valid date and time in format: mm/dd/yyyy HH:mm:ss'
1777
1778 });
1779 $('#txtMaxHRDate').focus();
1780 return;
1781 }
1782 } else {
1783 changes.push($('#txtMaxHRDate').val());//[19] Min HRDate
1784 }
1785
1786 if ($('#txtReportStudyStartTime').valid() && $('#txtReportStudyEndTime').valid()) {
1787 //Study start and end time (report start and end time are not needed when generating report)
1788 changes.push($('#txtReportStudyStartTime').val());//[20] Study Start Time
1789 changes.push($('#txtReportStudyEndTime').val());//[21] Study End Time
1790
1791 if (clinicalSummaryType == 2 || clinicalSummaryType == 3) {
1792 changes.push(studyTotalEvents); //[22] Study Total Number of Events
1793 }
1794 appInsights.trackEvent("Created Report");
1795
1796
1797 var reportName = "";
1798 switch (reportType) {
1799 case "DailyReport":
1800 reportName = "Daily Report";
1801 break;
1802 case "WeeklyReport":
1803 reportName = "Weekly Report";
1804 break;
1805 case "EOSReport":
1806 reportName = "End of Study Report";
1807 break;
1808 default:
1809 reportName = "End of Study Report";
1810 break;
1811 }
1812 if ($("#hfEditReport").val() == "true") {
1813 PageMethods.GenerateReport(reportName, currentStudyId, finalIncludedEvents, finalIncludedStrips, fincalExcludedEvents, finalExcludedStrips, includedEventNames, excludedEventNames, includedEventsTypes, includedEventsRates, excludedEventRates, includedEventDates, includedEventsComments, excludedEventsComments, includedEventsSVG, $('#txtStudyStartingDate').val(), changes, isMobile, returnedSavedReportId, $("#hfCreatedReportId").val(), onSuccessgeneratingReport);
1814 } else {
1815 PageMethods.GenerateReport(reportName, currentStudyId, finalIncludedEvents, finalIncludedStrips, fincalExcludedEvents, finalExcludedStrips, includedEventNames, excludedEventNames, includedEventsTypes, includedEventsRates, excludedEventRates, includedEventDates, includedEventsComments, excludedEventsComments, includedEventsSVG, $('#txtStudyStartingDate').val(), changes, isMobile, returnedSavedReportId, "null", onSuccessgeneratingReport);
1816 }
1817
1818 } else {
1819 $('#txtReportStudyStartTime').focus();
1820 }
1821
1822 } else {
1823 $('#txtSymptomatic').focus();
1824 }
1825 }
1826
1827
1828 $(document).ready(function () {
1829
1830
1831 $("#dlgOverRateDefinedEvents").dialog({
1832 title: 'Rate-defined Events.',
1833 autoOpen: false,
1834 resizable: false,
1835 draggable: false,
1836 modal: true,
1837 open: function (event, ui) {
1838 $('body').css('overflow', 'hidden');
1839
1840 },
1841 beforeClose: function (event, ui) {
1842 $('body').css('overflow', 'auto');
1843 },
1844
1845 });
1846
1847 $("#dlgNoteNoEvents").dialog({
1848 title: 'Attention!',
1849 autoOpen: false,
1850 resizable: false,
1851 draggable: false,
1852 modal: true,
1853 open: function (event, ui) {
1854 $('body').css('overflow', 'hidden');
1855
1856 },
1857 beforeClose: function (event, ui) {
1858 $('body').css('overflow', 'auto');
1859 },
1860
1861 });
1862
1863 $("#dlgNoteNoHR").dialog({
1864 title: 'Attention!',
1865 autoOpen: false,
1866 resizable: false,
1867 draggable: false,
1868 modal: true,
1869 open: function (event, ui) {
1870 if (!$('#btnOk').length) {
1871 $('#dlgNoteNoHR').append("<a class='ui-button-save' id='btnOk' onclick='GenerateReportFromConfirmPopup()' style='padding-top:14px; color:white;'>Yes</a>");
1872 }
1873 $('body').css('overflow', 'hidden');
1874
1875 },
1876 beforeClose: function (event, ui) {
1877 $('body').css('overflow', 'auto');
1878 },
1879
1880 });
1881
1882
1883 $("#btnCreateReport").click(function (e) {
1884 e.preventDefault();
1885 $("#hfCreateClicked").val("true");
1886 $("#hfEditReport").val("false");
1887
1888 if (includedEvents.length > 0) {
1889
1890 //Check the HR
1891 if (HRIncluded) {
1892 if (heartRateDataLength > 0) {
1893 SaveReport();
1894 } else {
1895 //Show a dialog that informs the user that there's no hr for the current study and prompt him to choose to either proceed or cancel
1896 $("#dlgNoteNoHR").dialog('open');
1897 }
1898
1899 } else {
1900 SaveReport();
1901 }
1902
1903
1904
1905 } else {
1906 //Show a dialog with a message of empty events
1907 $("#dlgNoteNoEvents").dialog('open');
1908 }
1909 return false;
1910 });
1911
1912 $("#btnSaveReport").click(function (e) {
1913 e.preventDefault();
1914 $("#hfCreateClicked").val("false");
1915
1916 if ($("#hfCreatedReportId").val() != "null" && $("#hfCreatedReportId").val() != null) {
1917 $("#hfEditReport").val("true");
1918 } else {
1919 $("#hfEditReport").val("false");
1920 }
1921 SaveReport();
1922 return false;
1923 });
1924
1925 $('#btnExcludeBurdenGraph').click(function (e) {
1926 e.preventDefault();
1927 if (burdenGraphIncluded) {
1928 burdenGraphIncluded = false;
1929 $('#btnExcludeBurdenGraph').removeClass('event-included');
1930 $('#btnExcludeBurdenGraph').addClass('event-excluded');
1931 } else {
1932 burdenGraphIncluded = true;
1933 $('#btnExcludeBurdenGraph').removeClass('event-excluded');
1934 $('#btnExcludeBurdenGraph').addClass('event-included');
1935 }
1936 return false;
1937 });
1938 });
1939
1940 function onSuccessgeneratingReport(url) {
1941 $('#imgReportInProgress').css('display', 'none');
1942 if (url != null) {
1943
1944 if ($("#hfEditReport").val() == "true" && $("#hfCreateClicked").val() != "true") {
1945 $.gritter.add({
1946 title: 'Report Edited!',
1947 text: 'The report has been edited!',
1948 class_name: 'gritter-light'
1949 });
1950 }
1951 if (isMobile) {
1952 var win = window.open(url, '_blank');
1953 } else {
1954 downloadPdf(url);
1955 }
1956 } else {
1957 $.gritter.add({
1958 title: 'Attention!',
1959 text: 'Please refresh and try again.</br></br>If problem persists, please contact your service provider.',
1960 class_name: 'gritter-light'
1961 });
1962 }
1963 }
1964
1965
1966 function DrawHRGraph(studyId, fromDate, toDate, hrGrouping) {
1967 if ($('#hfSavedEventId').val() == -1) {
1968 minHRVisibility = companyMinHRVisibility;
1969 maxHRVisibility = companyMaxHRVisibility;
1970 }
1971 var parameters = '{"studyId":"' + studyId + '","fromDate":"' + fromDate + '","toDate":"' + toDate + '"}';
1972
1973 var fromDateFormat = $.format.date(new Date(new Date(fromDate).toUTCString()), "MM/dd/yyyy 00:00");
1974 var toDateFormat = $.format.date(new Date(new Date(toDate).toUTCString()), "MM/dd/yyyy 23:59");
1975
1976 var minLim = new Date(fromDateFormat);
1977 var maxLim = new Date(toDateFormat);
1978
1979 minLim = moment.tz({
1980 year: minLim.getFullYear(), month: minLim.getMonth(), day: minLim.getDate(),
1981 hour: minLim.getHours(), minute: minLim.getMinutes()
1982 }, timeZone).valueOf();
1983
1984 maxLim = moment.tz({
1985 year: maxLim.getFullYear(), month: maxLim.getMonth(), day: maxLim.getDate(),
1986 hour: maxLim.getHours(), minute: maxLim.getMinutes()
1987 }, timeZone).valueOf();
1988
1989
1990 //The default HR presentation for the reporting in 15 mins (Grouping the points in 15 mins to a single point that describes the average)
1991 $('#selectReportRDG').val('dgFifteenMinutes');
1992 Highcharts.setOptions({
1993 time: {
1994 /**
1995 * Use moment-timezone.js to return the timezone offset for individual
1996 * timestamps, used in the X axis labels and the tooltip header.
1997 */
1998 getTimezoneOffset: function (timestamp) {
1999 var zone = timeZone,
2000 timezoneOffset = -moment.tz(timestamp, zone).utcOffset();
2001 return timezoneOffset;
2002 }
2003 },
2004 global: {
2005 useUTC: true
2006 }
2007 });
2008 $.ajax({
2009 url: './Services/WebServices.asmx/GetHeartRateData',
2010 data: parameters,
2011 dataType: "json",
2012 type: "POST",
2013 async: true,
2014 contentType: "application/json;",
2015 success: function (returnedHeartRateData) {
2016 if (returnedHeartRateData.d != null) {
2017 heartRateDataLength = returnedHeartRateData.d.length;
2018 heartRateRowDataReport = returnedHeartRateData.d;
2019 var min = [];
2020 var avg = [];
2021 var max = [];
2022 var theDate;
2023 var dateRounding;
2024 var firstCount = 0;
2025 var valueMin = 0;
2026 var valueAvg = 0;
2027 var valueMax = 0;
2028 var counter = 0;
2029
2030 for (var i = 0; i < heartRateRowDataReport.length; i++) {
2031 var heartRateRow = heartRateRowDataReport[i];
2032
2033 var localDate = new Date(fromJsonToJavaScriptDateTimeWithoutUTC(heartRateRow.Date));
2034 //var date = Date.UTC(localDate.getFullYear(), localDate.getMonth(), localDate.getDate(), localDate.getHours(), localDate.getMinutes(), localDate.getSeconds(), localDate.getMilliseconds());
2035 //var dateRound = Date.UTC(localDate.getFullYear(), localDate.getMonth(), localDate.getDate(), localDate.getHours());
2036 var date = Date.UTC(localDate.getUTCFullYear(), localDate.getUTCMonth(), localDate.getUTCDate(), localDate.getUTCHours(), localDate.getUTCMinutes(), localDate.getUTCSeconds(), localDate.getUTCMilliseconds());
2037 var dateRound = Date.UTC(localDate.getUTCFullYear(), localDate.getUTCMonth(), localDate.getUTCDate(), localDate.getUTCHours());
2038
2039 dateRound = (isNaN(theDate)) ? dateRound : theDate;
2040 dateRound = dateRound + 900000;
2041
2042 if (dateRound > date) {
2043 valueAvg = valueAvg + (isNaN(parseInt(heartRateRow.AvgHR)) ? 0 : (parseInt(heartRateRow.AvgHR)));
2044
2045 var Min = (isNaN(parseInt(heartRateRow.MinHR)) ? null : (parseInt(heartRateRow.MinHR)));
2046 valueMin = (valueMin == 0) ? (Min == null ? valueMin : Min) : (Min == null ? valueMin : ((Min < valueMin) ? Min : valueMin));
2047 var Max = (isNaN(parseInt(heartRateRow.MaxHR)) ? null : (parseInt(heartRateRow.MaxHR)));
2048 valueMax = ((Max == null ? valueMax : Max) > valueMax) ? Max : valueMax;
2049
2050 counter = counter + 1;
2051 if (((isNaN(parseInt(heartRateRow.MinHR))) || (isNaN(parseInt(heartRateRow.AvgHR))) || (isNaN(parseInt(heartRateRow.MaxHR)))) == true) {
2052 counter = counter - 1;
2053 }
2054 else {
2055 theDate = dateRound - 900000;
2056 }
2057
2058 if (i == (heartRateRowDataReport.length - 1)) {
2059
2060 valueAvg = valueAvg / ((isNaN(counter)) ? 1 : counter);
2061 min.push({ x: theDate, y: ((isNaN(valueMin)) ? null : valueMin)/*, z: heartRateRow.Seq */ });
2062 avg.push({ x: theDate, y: ((isNaN(valueAvg)) ? null : valueAvg)/*, z: heartRateRow.Seq */ });
2063 max.push({ x: theDate, y: ((isNaN(valueMax)) ? null : valueMax)/*, z: heartRateRow.Seq*/ });
2064 }
2065 }
2066 else {
2067 valueAvg = valueAvg / ((isNaN(counter)) ? 1 : counter);
2068 min.push({ x: theDate, y: ((isNaN(valueMin)) ? null : valueMin)/*, z: heartRateRow.Seq */ });
2069 avg.push({ x: theDate, y: ((isNaN(valueAvg)) ? null : valueAvg)/*, z: heartRateRow.Seq */ });
2070 max.push({ x: theDate, y: ((isNaN(valueMax)) ? null : valueMax)/*, z: heartRateRow.Seq*/ });
2071 var counting = 0;
2072 do {
2073 dateRound = dateRound + 900000;
2074 counting = counting + 1;
2075 }
2076 while (dateRound <= date);
2077
2078 if (counting > 1) {
2079 min.push({ x: dateRound - 900000, y: null /*, z: heartRateRow.Seq */ });
2080 avg.push({ x: dateRound - 900000, y: null /*, z: heartRateRow.Seq */ });
2081 max.push({ x: dateRound - 900000, y: null /*, z: heartRateRow.Seq */ });
2082 }
2083 dateRound = dateRound - 900000;
2084 if (((isNaN(parseInt(heartRateRow.MinHR))) || (isNaN(parseInt(heartRateRow.AvgHR))) || (isNaN(parseInt(heartRateRow.MaxHR)))) == false) {
2085 valueMin = parseInt(heartRateRow.MinHR);
2086 valueAvg = parseInt(heartRateRow.AvgHR);
2087 valueMax = parseInt(heartRateRow.MaxHR);
2088 }
2089
2090 counter = 1;
2091 theDate = dateRound;
2092 }
2093 }
2094
2095
2096 options = {
2097 title: { text: '' },
2098 chart: {
2099
2100 type: 'line',
2101 renderTo: 'containerHRChart',
2102 alignTicks: true,
2103 animation: false,
2104 zoomType: false
2105 },
2106 annotationsOptions: {
2107 enabledButtons: false
2108 },
2109 scrollbar: {
2110 liveRedraw: false
2111 },
2112
2113 plotOptions: {
2114
2115 line: {
2116 events: {
2117 legendItemClick: function () {
2118 var chart = this.chart;
2119 var index = this.index;
2120 var maxSerie = chart.series[0];
2121 var avgSerie = chart.series[1];
2122 var minSerie = chart.series[2];
2123
2124 if (maxSerie.index != index) {
2125 maxHRVisibility = maxSerie.visible;
2126 } else {
2127 maxHRVisibility = !maxSerie.visible;
2128 }
2129 if (avgSerie.index != index) {
2130 avgHRVisibility = avgSerie.visible;
2131 } else {
2132 avgHRVisibility = !avgSerie.visible;
2133 }
2134 if (minSerie.index != index) {
2135 minHRVisibility = minSerie.visible;
2136 } else {
2137 minHRVisibility = !minSerie.visible;
2138 }
2139 //return false; // <== returning false will cancel the default action
2140 }
2141 },
2142
2143 marker: {
2144 enabled: false
2145 }, states: {
2146 hover: {
2147 enabled: false
2148 }
2149 }
2150 }, series: {
2151 dataGrouping: {
2152 enabled: false
2153 },
2154 lineWidth: 0.4,
2155 color: 'black',
2156 stickyTracking: false,
2157 connectNulls: false
2158 }
2159 }, credits: {
2160 enabled: false
2161
2162 }
2163 , tooltip: {
2164
2165 enabled: false
2166 },
2167
2168 xAxis: {
2169 type: 'datetime',
2170 labels: {
2171 enabled: true
2172 },
2173 dateTimeLabelFormats: {
2174 Day: '%e of %b'
2175 },
2176 startOnTick: false,
2177 min: minLim,
2178 max: maxLim
2179
2180
2181 },
2182 yAxis: {
2183
2184 title: ''
2185 , labels: {
2186 enabled: true
2187 },
2188 endOnTick: false,
2189 startOnTick: false,
2190 min: minYLimit,
2191 max: maxYLimit
2192
2193 },
2194 legend: {
2195 enabled: true,
2196 align: 'center',
2197 verticalAlign: 'top',
2198 layout: 'horizontal'
2199 },
2200 exporting: {
2201 sourceWidth: 1075,
2202 sourceHeight: 250,
2203 enabled: false
2204 }
2205 ,
2206 marker: {
2207 enabled: true,
2208 radius: 3
2209 },
2210 series: [{
2211 name: 'Max Heart Rate',
2212 data: max,
2213 color: 'red',
2214 turboThreshold: 0,
2215 visible: maxHRVisibility
2216
2217 }, {
2218 name: 'Avg Heart Rate',
2219 data: avg,
2220 color: 'green',
2221 turboThreshold: 0,
2222 visible: avgHRVisibility
2223
2224
2225 }, {
2226 name: 'Min Heart Rate',
2227 data: min,
2228 color: 'rgb(0,255,0)',
2229 turboThreshold: 0,
2230 visible: minHRVisibility
2231 }]
2232 };
2233
2234 //
2235 if (hrGrouping != null) {
2236 switch (hrGrouping) {
2237
2238 case 'dgOneMinute':
2239 GroupingOneMinuteReport(heartRateRowDataReport, minHRVisibility, avgHRVisibility, maxHRVisibility);
2240 break;
2241 case 'dgFifteenMinutes':
2242 GroupingFifteenMinutesReport(heartRateRowDataReport, minHRVisibility, avgHRVisibility, maxHRVisibility);
2243 break;
2244 case 'dgThirtyMinutes':
2245 GroupingThirtyMinutesReport(heartRateRowDataReport, minHRVisibility, avgHRVisibility, maxHRVisibility);
2246 break;
2247 case 'dgOneHour':
2248 GroupingOneHourReport(heartRateRowDataReport, minHRVisibility, avgHRVisibility, maxHRVisibility);
2249 break;
2250 case 'dgOneDay':
2251 GroupingOneDayReport(heartRateRowDataReport, currentUTCHour, minHRVisibility, avgHRVisibility, maxHRVisibility);
2252 break;
2253 }
2254 }
2255
2256 HRChart = new Highcharts.Chart(options);
2257 var extremes = HRChart.yAxis[0].getExtremes();
2258 minHR = extremes.dataMin;
2259 maxHR = extremes.dataMax;
2260 avgHR = parseInt((minHR + maxHR) / 2);
2261 }
2262 }
2263 });
2264
2265
2266 }
2267
2268 function DrawCircleChart(name, container, percentage, color) {
2269
2270
2271 // Create the chart
2272 var label = parseInt(percentage * parseInt(studyTotalEvents) / 100).toString();
2273 var circleChart = $('#' + container).highcharts({
2274 chart: {
2275 type: 'pie',
2276 backgroundColor: 'transparent',
2277 margin: [0, 0, 0, 0],
2278 spacingTop: 0,
2279 spacingBottom: 0,
2280 spacingLeft: 0,
2281 spacingRight: 0
2282 },
2283 credits: {
2284 enabled: false //Disable highcharts.com on the bottom
2285 },
2286 title: {
2287 text: label,
2288 verticalAlign: 'middle',
2289 floating: true,
2290 style: {
2291 color: color
2292 }
2293 },
2294 exporting: {
2295 sourceWidth: 150,
2296 sourceHeight: 150,
2297 enabled: false
2298 },
2299 subtitle: {
2300 text: ''
2301 },
2302 yAxis: {
2303 title: {
2304 text: 'Total percent market share'
2305 }
2306 },
2307 plotOptions: {
2308 pie: {
2309 shadow: false,
2310 center: ['50%', '50%'],
2311 enableMouseTracking: false,
2312 borderColor: 'transparent'
2313 }
2314 },
2315 tooltip: {
2316 enabled: false,
2317 },
2318 series: [{
2319 name: name,
2320 data: [{
2321 name: name,
2322 y: percentage,
2323 color: color
2324 },
2325 {
2326 name: 'Transparent',
2327 y: 100 - percentage,
2328 color: 'Transparent'
2329 }],
2330 size: '90%',
2331 innerSize: '90%',
2332 dataLabels: {
2333 enabled: false,
2334 }
2335 }]
2336 });
2337
2338 }
2339 function DrawPieChart(studyId, fromDate, toDate) {
2340
2341 var parameters = '{"studyId":"' + studyId + '","fromDate":"' + fromDate + '","toDate":"' + toDate + '","reportType":"' + reportType + '}';
2342
2343 $.ajax({
2344 url: './Services/WebServices.asmx/GetArrhythmiaEventNumbers',
2345 data: parameters,
2346 dataType: "json",
2347 type: "POST",
2348 async: true,
2349 contentType: "application/json;",
2350 success: function (returnedArrhythmiaData) {
2351
2352 if (returnedArrhythmiaData.d != null) {
2353 var result = returnedArrhythmiaData.d;
2354 studyTotalEvents = parseInt(result.Brady) + parseInt(result.Tachy) + parseInt(result.AFib) + parseInt(result.Pause) + parseInt(result.PT);
2355 var categories = ['Bradycardia', 'Tachycardia', 'AFib', 'Pause', 'Patient Triggered'],
2356 data = [{
2357 y: result.Brady,
2358 color: 'green'
2359 }, {
2360 y: result.Tachy,
2361 color: 'red'
2362 }, {
2363 y: result.AFib,
2364 color: 'rgb(0,255,0)'
2365 }, {
2366 y: result.Pause,
2367 color: '#7798BF'
2368 }, {
2369 y: result.PT,
2370 color: '#16c0e8'
2371 }];
2372 options = {
2373 title: { text: '' },
2374 chart: {
2375
2376 type: 'pie',
2377 renderTo: 'containerPieChart',
2378 backgroundcolor: 'transparent',
2379 },
2380 annotationsOptions: {
2381 enabledButtons: false
2382 },
2383 scrollbar: {
2384 liveRedraw: false
2385 },
2386
2387 plotOptions: {
2388
2389 pie: {
2390 shadow: false,
2391 center: ['50%', '50%']
2392 }
2393
2394 }, credits: {
2395 enabled: false
2396
2397 }
2398 , tooltip: {
2399
2400 enabled: false
2401 },
2402 legend: {
2403 enabled: true,
2404 align: 'center',
2405 verticalAlign: 'top',
2406 layout: 'horizontal'
2407 },
2408 exporting: {
2409 sourceWidth: 250,
2410 sourceHeight: 250,
2411 enabled: false
2412 }
2413 ,
2414 marker: {
2415 enabled: true,
2416 radius: 3
2417 },
2418 series: [{
2419 name: 'Arrhythmia Event Numbers',
2420 data: data,
2421 turboThreshold: 0,
2422 dataLabels: {
2423 formatter: function () {
2424
2425 return this.y;
2426 },
2427 color: 'white',
2428 distance: -40,
2429 style: { fontFamily: '\'Lato\', sans-serif', lineHeight: '18px', fontSize: '17px' }
2430 }
2431
2432
2433
2434 }]
2435 };
2436
2437 PieChart = new Highcharts.Chart(options);
2438 }
2439 }
2440 });
2441
2442
2443 }
2444
2445 //Arrhythmia Burden Calculation
2446 function DrawArrhythmiaBurdenGraph(studyId, fromDate, toDate) {
2447
2448
2449 var AFData = [];
2450 var TCData = [];
2451 var BCData = [];
2452 var MonitoredHoursData_Tachy = [];
2453 var MonitoredHoursData_Brady = [];
2454 var MonitoredHoursData_AF = [];
2455
2456 var parameters = '{"studyId":"' + studyId + '","from":"' + fromDate + '","to":"' + toDate + '"}';
2457
2458 $.ajax({
2459 url: './Services/WebServices.asmx/GetArrhythmiaBurdenByDay',
2460 data: parameters,
2461 dataType: "json",
2462 type: "POST",
2463 async: true,
2464 contentType: "application/json;",
2465 success: function (returnedHeartRateData1) {
2466 if (returnedHeartRateData1.d != null) {
2467 for (var i = 0; i < returnedHeartRateData1.d.length; i++) {
2468 var localDate = new Date(fromJsonToJavaScriptDateTime(returnedHeartRateData1.d[i].Date));
2469 var date = parseInt(returnedHeartRateData1.d[i].Date.split('(')[1].split(')')[0]);
2470
2471 AFData.push({ x: date, y: (returnedHeartRateData1.d[i].Atrial) * (returnedHeartRateData1.d[i].DayHours / 24), z: returnedHeartRateData1.d[i].DayHours, label: returnedHeartRateData1.d[i].Atrial });
2472 TCData.push({ x: date, y: (returnedHeartRateData1.d[i].Tachy) * (returnedHeartRateData1.d[i].DayHours / 24), z: returnedHeartRateData1.d[i].DayHours, label: returnedHeartRateData1.d[i].Tachy });
2473 BCData.push({ x: date, y: (returnedHeartRateData1.d[i].Brady) * (returnedHeartRateData1.d[i].DayHours / 24), z: returnedHeartRateData1.d[i].DayHours, label: returnedHeartRateData1.d[i].Brady });
2474 MonitoredHoursData_Tachy.push({ x: date, y: (returnedHeartRateData1.d[i].DayHours * 100 / 24) - ((returnedHeartRateData1.d[i].Tachy) * (returnedHeartRateData1.d[i].DayHours / 24)), z: returnedHeartRateData1.d[i].DayHours });
2475 MonitoredHoursData_Brady.push({ x: date, y: (returnedHeartRateData1.d[i].DayHours * 100 / 24) - ((returnedHeartRateData1.d[i].Brady) * (returnedHeartRateData1.d[i].DayHours / 24)), z: returnedHeartRateData1.d[i].DayHours });
2476 MonitoredHoursData_AF.push({ x: date, y: (returnedHeartRateData1.d[i].DayHours * 100 / 24) - ((returnedHeartRateData1.d[i].Atrial) * (returnedHeartRateData1.d[i].DayHours / 24)), z: returnedHeartRateData1.d[i].DayHours });
2477 }
2478
2479 ArrChart = DrawArrhythmiaBurdenChart(AFData, TCData, BCData, MonitoredHoursData_Tachy, MonitoredHoursData_Brady, MonitoredHoursData_AF);
2480
2481 }
2482
2483 },
2484 error: function (error) {
2485
2486 },
2487 failure: function (failure) {
2488 }
2489 });
2490
2491 }
2492
2493 function DrawArrhythmiaBurdenChart(AFData, TCData, BCData, MonitoredHoursData_Tachy, MonitoredHoursData_Brady, MonitoredHoursData_AF) {
2494
2495 var options = {
2496 title: { text: '' },
2497 defs: {
2498 patterns: [{
2499 'id': 'custom-pattern-a',
2500 'path': {
2501 d: linePattern1,
2502 stroke: '#ff0066',
2503 strokeWidth: 2,
2504 fill: '#fff'
2505 },
2506
2507 }, {
2508 'id': 'custom-pattern-b',
2509 'path': {
2510 d: linePattern2,
2511 stroke: '#000',
2512 strokeWidth: 2,
2513 fill: '#fff',
2514 },
2515 },
2516 {
2517 'id': 'custom-pattern-c',
2518 'path': {
2519 d: linePattern3,
2520 stroke: '#35e000',
2521 strokeWidth: 2,
2522 fill: '#fff',
2523 },
2524 }]
2525 },
2526 chart: {
2527
2528 type: 'column',
2529 renderTo: 'containerAFBurden',
2530 alignTicks: true,
2531 animation: false,
2532 zoomType: false
2533 },
2534 annotationsOptions: {
2535 enabledButtons: false
2536 },
2537 scrollbar: {
2538 liveRedraw: false
2539 },
2540
2541 plotOptions: {
2542 column: {
2543 stacking: 'normal'
2544 },
2545 line: {
2546
2547 marker: {
2548 enabled: false
2549 }, states: {
2550 hover: {
2551 enabled: false
2552 }
2553 }
2554 }, series: {
2555 events: {
2556 legendItemClick: function () {
2557
2558 //return false; // <== returning false will cancel the default action
2559 if (this.index == 0) {
2560 //The user clicked the monitored hours series
2561 var series = this.chart.series;
2562 if (!this.visible) {
2563 series[2].show();
2564 series[4].show();
2565 } else {
2566 series[2].hide();
2567 series[4].hide();
2568 }
2569 } else {
2570 var monitoredHoursIndex = this.index - 1;
2571 var series = this.chart.series;
2572 if (!this.visible) {
2573 series[monitoredHoursIndex].show();
2574 } else {
2575 series[monitoredHoursIndex].hide();
2576 }
2577 }
2578 }
2579 },
2580 dataGrouping: {
2581 enabled: false
2582 },
2583 lineWidth: 0.4,
2584 color: 'black',
2585 stickyTracking: false
2586 }
2587 }, credits: {
2588 enabled: false
2589 }
2590 , tooltip: {
2591
2592 enabled: false
2593 },
2594
2595 xAxis: {
2596 type: 'datetime',
2597 labels: {
2598 enabled: true,
2599 formatter: function () {
2600 var xDate = moment.tz(this.value, timeZone).format('LLLL');
2601
2602 xDate = xDate.split(',');
2603 xDate = xDate[1].split(' ');
2604 return xDate[2] + '. ' + xDate[1].slice(0, 3);
2605 }
2606 },
2607 tickInterval: 3600 * 1000 * 24,
2608 startOnTick: false
2609
2610 },
2611 yAxis: {
2612
2613 title: ''
2614 , labels: {
2615 enabled: false
2616 },
2617 endOnTick: false,
2618 startOnTick: false,
2619 min: 0,
2620 max: 140
2621
2622
2623 },
2624 legend: {
2625 enabled: true,
2626 align: 'center',
2627 verticalAlign: 'top',
2628 layout: 'horizontal'
2629 },
2630 exporting: {
2631 sourceWidth: 1075,
2632 sourceHeight: 250,
2633 enabled: false
2634 }
2635 ,
2636 marker: {
2637 enabled: true,
2638 radius: 3
2639 },
2640 series: [{
2641 name: 'Monitored Hours',
2642 data: MonitoredHoursData_Tachy,
2643 color: 'white',
2644 borderColor: 'black',
2645 stack: 'Tachy',
2646 visible: tachyBurdenVisibility
2647
2648
2649 }, {
2650 name: 'Tachycardia Burden',
2651 data: TCData,
2652 color: 'url(#custom-pattern-a)',
2653 stack: 'Tachy',
2654 turboThreshold: 0,
2655 visible: tachyBurdenVisibility,
2656 dataLabels: {
2657 align: 'left',
2658 enabled: true,
2659 rotation: 270,
2660 x: 4,
2661 y: -2,
2662 crop: false,
2663 overflow: 'none',
2664 padding: 0,
2665 inside: false,
2666 style: {
2667 color: '#000000',
2668 fontSize: '15px',
2669 fontFamily: 'Verdana, sans-serif'
2670 },
2671 useHTML: true,
2672 formatter: function () {
2673
2674 if (this.point.y > 0)
2675 return '<span style="color:black;text-shadow: 0 0 0.2em #fff, 0 0 0.2em #fff, 0 0 0.2em #fff;font-family: \'Lato\', sans-serif;">' + this.point.label + '%</span>'
2676
2677 }
2678 }
2679
2680
2681 }, {
2682 name: 'Monitored Hours',
2683 data: MonitoredHoursData_Brady,
2684 color: 'white',
2685 borderColor: 'black',
2686 visible: bradyBurdenVisibility,
2687 stack: 'Brady',
2688 showInLegend: false,
2689 dataLabels: {
2690 enabled: true,
2691 align: 'center',
2692 crop: false,
2693 y: -52,
2694 overflow: 'none',
2695 useHTML: true,
2696 style: {
2697 fontSize: '15px',
2698 fontFamily: 'Verdana, sans-serif',
2699 color: '#000000'
2700 },
2701 verticalAlign: 'top',
2702 formatter: function () {
2703
2704 if (this.point.y >= 0) {
2705 return '<span style="color:\'black\';">' + this.point.z.toPrecision(3) + 'h' + '</span>'
2706
2707 }
2708 }
2709 }
2710
2711 }, {
2712 name: 'Bradycardia Burden',
2713 data: BCData,
2714 color: 'url(#custom-pattern-b)',
2715 stack: 'Brady',
2716 visible: bradyBurdenVisibility,
2717 turboThreshold: 0,
2718 dataLabels: {
2719 align: 'left',
2720 enabled: true,
2721 rotation: 270,
2722 x: 4,
2723 y: -2,
2724 crop: false,
2725 overflow: 'none',
2726 padding: 0,
2727 inside: false,
2728 style: {
2729 fontSize: '15px',
2730 fontFamily: 'Verdana, sans-serif',
2731 color: '#000000'
2732 },
2733 useHTML: true,
2734 formatter: function () {
2735
2736 if (this.point.y > 0)
2737 return '<span style="color:black;text-shadow: 0 0 0.2em #fff, 0 0 0.2em #fff, 0 0 0.2em #fff;font-family: \'Lato\', sans-serif;">' + this.point.label + '%</span>'
2738
2739
2740 }
2741 }
2742
2743
2744 }, {
2745 name: 'Monitored Hours',
2746 data: MonitoredHoursData_AF,
2747 visible: afBurdenVisibility,
2748 color: 'white',
2749 borderColor: 'black',
2750 stack: 'AFib',
2751 showInLegend: false
2752
2753 }, {
2754 name: 'AF Burden',
2755 data: AFData,
2756 visible: afBurdenVisibility,
2757 color: 'url(#custom-pattern-c)',
2758 stack: 'AFib',
2759 turboThreshold: 0,
2760 dataLabels: {
2761 align: 'left',
2762 enabled: true,
2763 rotation: 270,
2764 x: 4,
2765 y: -2,
2766 crop: false,
2767 overflow: 'none',
2768 padding: 0,
2769 inside: false,
2770 style: {
2771 fontSize: '15px',
2772 fontFamily: 'Verdana, sans-serif',
2773 color: '#000000'
2774 },
2775 useHTML: true,
2776 formatter: function () {
2777 if (this.point.y > 0)
2778 return '<span style="color:black;text-shadow: 0 0 0.2em #fff, 0 0 0.2em #fff, 0 0 0.2em #fff;font-family: \'Lato\', sans-serif;">' + this.point.label + '%</span>'
2779
2780
2781 }
2782 }
2783 }]
2784 };
2785
2786 var chart = new Highcharts.Chart(options)
2787 //Adjust the legend symbol border for the Monitored hours
2788 $(chart.series[0].legendSymbol.element).attr('stroke-width', '1');
2789 $(chart.series[0].legendSymbol.element).attr('stroke', 'black');
2790
2791
2792 return chart;
2793 }
2794 function GoToEvent(eventId) {
2795 var type = 'all';
2796 //if (isMobile) {
2797 // getRequestData('MobilePatientEventsList.aspx', 'studyId=' + currentStudyId + '&type=' + type + '&eventId=' + eventId);
2798 //}
2799 //else {
2800 getRequestData('PatientEventsList.aspx', 'studyId=' + currentStudyId + '&type=' + type + '&eventId=' + eventId);
2801 //}
2802 }
2803
2804 function calculateHRValuesWithRange(allHrData) {
2805 let minHREvents = Number.MAX_SAFE_INTEGER;
2806 let maxHREvents = Number.MIN_SAFE_INTEGER;
2807 let avgHREvents = 0;
2808 let maxHREventsDate = 'N/A';
2809 let minHREventsDate = 'N/A';
2810 let numberOfValidHRValues = 0;
2811 let sumOfValidHRValues = 0;
2812 if (allHrData.length != 0) {
2813 for (var i = 0; i < allHrData.length; i++) {
2814 let currentMinHR = parseInt(allHrData[i].minHR),
2815 currentMaxHR = parseInt(allHrData[i].maxHR),
2816 currentDate = allHrData[i].date;
2817
2818 if (!isNaN(currentMinHR)) {
2819 if (currentMinHR < minHREvents) {
2820 minHREvents = currentMinHR;
2821 minHREventsDate = currentDate;
2822 }
2823 sumOfValidHRValues += currentMinHR;
2824 numberOfValidHRValues++;
2825 }
2826
2827 if (!isNaN(currentMaxHR)) {
2828 if (currentMaxHR > maxHREvents) {
2829 maxHREvents = currentMaxHR;
2830 maxHREventsDate = currentDate;
2831 }
2832 sumOfValidHRValues += currentMaxHR;
2833 numberOfValidHRValues++;
2834 }
2835 }
2836 if (numberOfValidHRValues != 0) {
2837 avgHREvents = sumOfValidHRValues / numberOfValidHRValues;
2838 }
2839 }
2840 if (allHrData.length == 0 || numberOfValidHRValues == 0) {
2841 minHREvents = 0;
2842 maxHREvents = 0;
2843 avgHREvents = 0;
2844 maxHREventsDate = 'N/A';
2845 minHREventsDate = 'N/A';
2846 }
2847 if (minHREvents == Number.MAX_SAFE_INTEGER) {
2848 minHREvents = 0;
2849 }
2850 if (maxHREvents == Number.MIN_SAFE_INTEGER) {
2851 maxHREvents = 0;
2852 }
2853
2854 $('#txtMaxHRDate').val(maxHREventsDate);
2855 $('#txtMinHRDate').val(minHREventsDate);
2856 $('#txtMaxHR').val(maxHREvents);
2857 $('#txtMinHR').val(minHREvents);
2858 $('#txtAvgHR').val(parseInt(avgHREvents));
2859
2860 setStudyClinicalHRValues();
2861 }
2862
2863 function addHRValuesToArray(range, avg, date, allHrData) {
2864 let hrValues = range.split('-');
2865 let minHR = parseInt(hrValues[0]);
2866 let maxHR = parseInt(hrValues[1]);
2867 let avgHR = parseInt(avg);
2868 let ev = {
2869 minHR: minHR,
2870 avgHR: avgHR,
2871 maxHR: maxHR,
2872 date: date
2873 }
2874 allHrData.push(ev);
2875 return;
2876 }
2877
2878
2879 //Hide all sections initially
2880
2881 $(document).ready(function (event) {
2882
2883 $('input:radio[name="ReportType"]').change(function (event) {
2884 $(this).parent().siblings().removeClass('selected');
2885 $(this).parent().addClass('selected');
2886
2887 reportType = $(this).val();
2888
2889 ManageDailyReportDivs();
2890 HideAndResetSections();
2891 });
2892
2893 });
2894
2895 function ManageDailyReportDivs() {
2896 if (reportType == "DailyReport") {
2897 $('#ReportEndTime').hide();
2898 }
2899 else {
2900 $('#ReportEndTime').show();
2901 $('#txtStudyEndDate').rules('add', { required: true });
2902 }
2903 }
2904
2905 function HideAndResetSections() {
2906 $('#txtMaxHR').val('');
2907 $('#txtMinHR').val('');
2908 $('#txtAvgHR').val('');
2909 $('#txtMaxHRDate').val('');
2910 $('#txtMinHRDate').val('');
2911 $('#txtFindings').val('');
2912 $('#txtPhysInterpretation').val('');
2913 $('#txtSymptomatic').val('0');
2914 $('#txtAsymptomatic').val('0');
2915 $('#txtAF').val('0');
2916 $('#txtBrady').val('0');
2917 $('#txtTachy').val('0');
2918 $('#txtPause').val('0');
2919 $('#EventsSection').hide();
2920 $('#divHRAndBurdenGraphs').hide();
2921 $('#ClinicalSummary').hide();
2922 $('#ClinicalFindings').hide();
2923 ManageReportDates();
2924 }
2925
2926 function ManageReportDates() {
2927 if (reportType == "EOSReport") {
2928 $('#txtStudyStartingDate').val(studyStartTime);
2929 $('#txtStudyEndDate').val(studyEndTime);
2930 LoadEvents(null);
2931 } else {
2932 $('#txtStudyStartingDate').val('');
2933 $('#txtStudyEndDate').val('');
2934 }
2935 }
2936
2937 function ShowAllSections() {
2938 $('#EventsSection').show();
2939 console.log(HRIncluded);
2940 console.log(BurdenIncluded);
2941 if (!HRIncluded && !BurdenIncluded) {
2942 //Hide the HR and Burden charts for wireless event
2943 $('#divHRAndBurdenGraphs').hide();
2944 } else {
2945 $('#divHRAndBurdenGraphs').show();
2946 }
2947 $('#ClinicalSummary').show();
2948 $('#ClinicalFindings').show();
2949 }
2950
2951 function setStudyClinicalHRValues() {
2952 if (($("#txtMaxHR").val() == 0 && $("#txtMinHR").val() == 0 && $("#txtAvgHR").val() == 0) || $("#txtMinHRDate").val() == "N/A" || $("#txtMaxHRDate").val() == "N/A" || hrCalculationEvents == false) {
2953 $('#txtMaxHR').val(txtStudyMaxHR);
2954 $('#txtMinHR').val(txtStudyMinHR);
2955 $('#txtAvgHR').val(txtStudyAvgHR);
2956 $('#txtMaxHRDate').val(txtStudyMaxHRDate);
2957 $('#txtMinHRDate').val(txtStudyMinHRDate);
2958 }
2959 }
2960
2961 </script>
2962 <style type="text/css">
2963 table td {
2964 border: 0;
2965 padding: 0;
2966 vertical-align: middle;
2967 height: 26px;
2968 }
2969
2970 form p, form label, .form-row p, .form-row label {
2971 float: none;
2972 }
2973
2974 #ReportTypes {
2975 width: 100%;
2976 box-sizing: border-box;
2977 float: left;
2978 background-color: white;
2979 box-shadow: 0px 1px 2px 1px rgba(0, 0, 0, 0.4);
2980 text-align: center;
2981 position: relative;
2982 border-radius: 2px;
2983 }
2984
2985 .ReportClass {
2986 text-align: center;
2987 }
2988
2989 .ReportClass.selected {
2990 color: white;
2991 padding-top: 24px;
2992 display: block;
2993 position: absolute;
2994 top: -4px;
2995 left: -4px;
2996 bottom: -4px;
2997 width: calc(100% + 8px);
2998 border-radius: 2px;
2999 box-shadow: 0px 1px 2px 1px rgba(0, 0, 0, 0.4);
3000 z-index: 1;
3001 pointer-events: none;
3002 transition: transform 0.3s;
3003 }
3004
3005 form::after {
3006 content: "";
3007 display: block;
3008 clear: both;
3009 }
3010
3011 #EOSLabel, #WeeklyLabel, #DailyLabel {
3012 float: left;
3013 width: calc(33.333% - 1px);
3014 position: relative;
3015 padding: 15px 0px 30px;
3016 overflow: hidden;
3017 border-left: solid 1px rgba(0,0,0,0.2);
3018 transition: color 0.3s;
3019 cursor: pointer;
3020 -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
3021 }
3022
3023 form label:first-child {
3024 border-left: none;
3025 }
3026
3027 form label input {
3028 position: absolute;
3029 top: -200%;
3030 }
3031
3032 form label div {
3033 z-index: 5;
3034 position: absolute;
3035 width: 100%;
3036 }
3037
3038 form label.selected {
3039 color: white;
3040 background-color: rgba(50, 150, 255,1);
3041 }
3042 </style>
3043 <script type="text/html" id="tmplEvent">
3044 <div id="eventTmpl_${EventId}_${StripId}" class="events-list-elem" style="background: white;">
3045 <div id="Container_${EventId}_${StripId}">
3046 </div>
3047 <div id="tmplHeader" class="tmplHeader">
3048 <div class="tmpl-event-name">
3049 <p>
3050 Name
3051 </p>
3052 <div>
3053 <select id='slctEventActualDescription_${EventId}_${StripId}' <%--value="${EventName}"--%>>
3054 </select>
3055 </div>
3056 </div>
3057 <div class="tmpl-event-type">
3058 <p>
3059 Type
3060 </p>
3061 <div>
3062 <select name="ddlEventType_${EventId}_${StripId}" id="ddlEventType_${EventId}_${StripId}">
3063 <option value="Default">Default</option>
3064 <option value="AF">AF Trigger</option>
3065 <option value="MinOHR">Min. Overall HR</option>
3066 <option value="MaxOHR">Max. Overall HR</option>
3067 <option value="MinAFHR">Min. AF HR</option>
3068 <option value="MaxAFHR">Max. AF HR</option>
3069 </select>
3070 </div>
3071 </div>
3072 <div class="tmpl-event-rate">
3073 <p>
3074 Rate
3075 </p>
3076 <div>
3077 <input type="text" id='txtRate_${EventId}_${StripId}' value="${Rate}" data-avg-rate="${AVGRate}" />
3078 <span>BPM</span>
3079 </div>
3080 </div>
3081 <div class="tmpl-event-date">
3082 <p>
3083 Date
3084 </p>
3085 <div>
3086 <input type="text" id='txtEventDate_${EventId}_${StripId}' value="${EventDate}" style="margin-right: 1%;" disabled />
3087 </div>
3088 </div>
3089 <div class="tmpl-event-include">
3090 <a id="btnIncludedInReport_${EventId}_${StripId}" class="event-included" href="#"></a>
3091
3092 <a class="ui-button-report" href="#" onclick="GoToEvent(${EventId})">Go To Event</a>
3093 <a class="ui-button-report commentsButton" href="#" onclick="LoadComments(event,${EventId},${StripId})" style="display: none; margin-right: 10px; font-size: 20px;">🖉</a>
3094 </div>
3095 </div>
3096 <div class="report-comments-container">
3097 <textarea rows="2" id='txtComment_${EventId}_${StripId}' maxlength="266" placeholder="Add Notes" style="float: left; margin-bottom: 10px;">${Comments}</textarea>
3098
3099 </div>
3100 <%--<hr style="width: 100%; line-height: 2px; color: black;" />--%>
3101 </div>
3102 </script>
3103 <script id="tmplEventTypes" type="text/html">
3104 <option value='${Description}'>${Description}</option>
3105 </script>
3106 <div>
3107 <asp:HiddenField ID="hfCurrentStudyId" runat="server" ClientIDMode="Static" />
3108 <asp:HiddenField ID="hfSavedEventId" Value="-1" runat="server" ClientIDMode="Static" />
3109 <asp:HiddenField ID="hfCreatedReportId" Value="null" runat="server" ClientIDMode="Static" />
3110 <asp:HiddenField ID="hfbtnSaveReportStyle" Value="null" runat="server" ClientIDMode="Static" />
3111 <asp:HiddenField ID="hfEditReport" Value="null" runat="server" ClientIDMode="Static" />
3112 <asp:HiddenField ID="hfCreateClicked" Value="null" runat="server" ClientIDMode="Static" />
3113 </div>
3114 <div class="report-details-container">
3115 <div class="box grid_12" style="background: white">
3116 <form action="" id="ReportTypes">
3117 <label id="EOSLabel" class="selected">
3118 <input type="radio" name="ReportType" data-location="0" value="EOSReport" />
3119 <div class="ReportClass">Create EOS Report</div>
3120 </label>
3121 <label id="WeeklyLabel">
3122 <input type="radio" name="ReportType" data-location="calc(100% - 8px)" value="WeeklyReport" />
3123 <div class="ReportClass">Create Weekly Report</div>
3124 </label>
3125 <label id="DailyLabel">
3126 <input type="radio" name="ReportType" data-location="calc(200% - 12px)" value="DailyReport" />
3127 <div class="ReportClass">Create Daily</div>
3128 </label>
3129 </form>
3130
3131 </div>
3132 <div class="box grid_12">
3133 <div class="box-head white-box-head">
3134 <h2>Study Info</h2>
3135 </div>
3136 <div class="box-content">
3137 <div>
3138 <div>
3139 <p>Patient Name</p>
3140 <div>
3141 <input id="txtCustomPatientName" type="text" />
3142 </div>
3143 <p>Report Start Time</p>
3144 <div>
3145 <input type="text" id="txtStudyStartingDate" autocomplete="off" data-msg-required="Please specify a specific date! Thank you!"
3146 data-rule-required="true" readonly="readonly" />
3147 </div>
3148 <div id="ReportEndTime">
3149 <p>Report End Time</p>
3150 <div>
3151 <input type="text" id="txtStudyEndDate" autocomplete="off" data-msg-required="Please specify a specific date! Thank you!"
3152 data-rule-required="true" readonly="readonly" />
3153 </div>
3154 </div>
3155 </div>
3156 <div>
3157 <p>Study Type</p>
3158 <div>
3159 <asp:TextBox ClientIDMode="Static" ID="txtReportStudyType" runat="server" Text=""></asp:TextBox>
3160 </div>
3161 <p>Study Start Time</p>
3162 <div>
3163 <asp:TextBox ClientIDMode="Static" ID="txtReportStudyStartTime" runat="server" Text="" data-rule-required="true" data-msg-required="Please insert the right study start time" data-rule-datetime="true" data-msg-datetime="Please fill a valid date and time in format: mm/dd/yyyy HH:mm:ss"></asp:TextBox>
3164 </div>
3165 <p>Study End Time</p>
3166 <div>
3167 <asp:TextBox ClientIDMode="Static" ID="txtReportStudyEndTime" runat="server" Text="" data-rule-required="true" data-msg-required="Please insert the right study end time" data-rule-datetime="true" data-msg-datetime="Please fill a valid date and time in format: mm/dd/yyyy HH:mm:ss"></asp:TextBox>
3168 </div>
3169 </div>
3170 </div>
3171 <div class="button-container">
3172 <a class="ui-button-report" href="#" onclick="LoadEvents(null)" style="position: initial;">Ok</a>
3173 </div>
3174 </div>
3175
3176 </div>
3177 <div id="ClinicalSummary" class="box grid_12" style="display: none;">
3178 <div class="box-head white-box-head">
3179 <h2>Clinical Summary</h2>
3180 </div>
3181 <div class="box-content" style="height: auto; overflow-x: auto">
3182 <div>
3183 <div id="boxStatisticsPie" style="display: none;">
3184 <p style="font-weight: bold; margin-bottom: 5px;">Events Statistics</p>
3185 <asp:TextBox ClientIDMode="Static" ID="txtTotalEvents" runat="server" Text=""></asp:TextBox>
3186 <table class="sub-table">
3187 <tr>
3188 <td rowspan="2">
3189 <div id="containerPieChart" style="height: 250px; margin: 0; width: 250px; margin-left: 2%; margin-right: 2%;"
3190 class="ECGContainer">
3191 </div>
3192 </td>
3193 </tr>
3194 </table>
3195 <div>
3196 </div>
3197 </div>
3198 <div id="boxStatisticsCircles" style="display: none;">
3199 <p style="font-weight: bold; margin-bottom: 5px;">Events Statistics</p>
3200 <table class="sub-table">
3201 <tr>
3202 <td>Total Events</td>
3203 <td colspan="4">
3204 <asp:TextBox ClientIDMode="Static" ID="txtTotalEventsInCircles" runat="server" Text=""></asp:TextBox></td>
3205 </tr>
3206 <tr>
3207 <td>
3208 <div id="containerTotalEventsCircle" style="height: 150px; margin: 0; width: 150px; margin-left: 2%; margin-right: 2%;"
3209 class="ECGContainer">
3210 </div>
3211 <div style="text-align: center;">
3212 <label style="color: rgb(0,53,255);">Total Events</label>
3213 </div>
3214 </td>
3215 <td>
3216 <div id="containerPTEventsCircle" style="height: 150px; margin: 0; width: 150px; margin-left: 2%; margin-right: 2%;"
3217 class="ECGContainer">
3218 </div>
3219 <div style="text-align: center;">
3220 <label style="color: rgb(0,176,240);">Patient Triggered</label>
3221 </div>
3222 </td>
3223 <td>
3224 <div id="containerPauseEventsCircle" style="height: 150px; margin: 0; width: 150px; margin-left: 2%; margin-right: 2%;"
3225 class="ECGContainer">
3226 </div>
3227 <div style="text-align: center;">
3228 <label style="color: rgb(0,53,52);">Pause</label>
3229 </div>
3230 </td>
3231 <td>
3232 <div id="containerTachyEventsCircle" style="height: 150px; margin: 0; width: 150px; margin-left: 2%; margin-right: 2%;"
3233 class="ECGContainer">
3234 </div>
3235 <div style="text-align: center;">
3236 <label style="color: rgb(153,51,153);">Tachycardia</label>
3237 </div>
3238 </td>
3239 <td>
3240 <div id="containerBradyEventsCircle" style="height: 150px; margin: 0; width: 150px; margin-left: 2%; margin-right: 2%;"
3241 class="ECGContainer">
3242 </div>
3243 <div style="text-align: center;">
3244 <label style="color: rgb(255,0,153);">Bradycardia</label>
3245 </div>
3246 </td>
3247 <td>
3248 <div id="containerAFEventsCircle" style="height: 150px; margin: 0; width: 150px; margin-left: 2%; margin-right: 2%;"
3249 class="ECGContainer">
3250 </div>
3251 <div style="text-align: center;">
3252 <label style="color: rgb(255,102,51);">Atrial Fibrillation</label>
3253 </div>
3254 </td>
3255 </tr>
3256
3257 </table>
3258 <div>
3259 </div>
3260 </div>
3261 <div class="boxStatisticsNumbering" style="display: none;">
3262 <p class="summary-title">Patient Triggered Events</p>
3263 <div>
3264 <p>Symptomatic</p>
3265 <div>
3266 <asp:TextBox ClientIDMode="Static" ID="txtSymptomatic" runat="server" Text="" data-rule-required="true" data-msg-required="This field is required" data-rule-number="true" data-msg-number="Please fill valid number "></asp:TextBox></td>
3267 </div>
3268 </div>
3269 <div>
3270 <p>Asymptomatic</p>
3271 <div>
3272 <asp:TextBox ClientIDMode="Static" ID="txtAsymptomatic" runat="server" Text="" data-rule-required="true" data-msg-required="This field is required" data-rule-number="true" data-msg-number="Please fill valid number "></asp:TextBox></td>
3273 </div>
3274 </div>
3275 </div>
3276 <div class="boxStatisticsNumbering" style="display: none;">
3277 <p class="summary-title">Device Triggered Events</p>
3278 <div>
3279 <p>Bradycardia</p>
3280 <div>
3281 <asp:TextBox ClientIDMode="Static" ID="txtBrady" runat="server" Text="" data-rule-required="true" data-msg-required="This field is required" data-rule-number="true" data-msg-number="Please fill valid number "></asp:TextBox>
3282 </div>
3283 </div>
3284 <div>
3285 <p>Tachycardia</p>
3286 <div>
3287 <asp:TextBox ClientIDMode="Static" ID="txtTachy" runat="server" Text="" data-rule-required="true" data-msg-required="This field is required" data-rule-number="true" data-msg-number="Please fill valid number "></asp:TextBox>
3288 </div>
3289 </div>
3290 <div>
3291 <p>Pause</p>
3292 <div>
3293 <asp:TextBox ClientIDMode="Static" ID="txtPause" runat="server" Text="" data-rule-required="true" data-msg-required="This field is required" data-rule-number="true" data-msg-number="Please fill valid number "></asp:TextBox></td>
3294 </div>
3295 </div>
3296 <div>
3297 <p>Atrial Fibrillation</p>
3298 <div>
3299 <asp:TextBox ClientIDMode="Static" ID="txtAF" runat="server" Text="" data-rule-required="true" data-msg-required="This field is required" data-rule-number="true" data-msg-number="Please fill valid number "></asp:TextBox></td>
3300 </div>
3301 </div>
3302 </div>
3303 <div class="heart-rate-box">
3304 <p class="summary-title">Heart Rate</p>
3305 <div>
3306 <p>Min Heart Rate</p>
3307 <div>
3308 <asp:TextBox ClientIDMode="Static" ID="txtMinHR" runat="server" Text=""></asp:TextBox>
3309 @
3310 <asp:TextBox ClientIDMode="Static" ID="txtMinHRDate" runat="server" Text=""></asp:TextBox>
3311 </div>
3312 </div>
3313 <div>
3314 <p>Avg Heart Rate</p>
3315 <div>
3316 <asp:TextBox ClientIDMode="Static" ID="txtAvgHR" runat="server" Text=""></asp:TextBox>
3317 </div>
3318 </div>
3319 <div>
3320 <p>Max Heart Rate</p>
3321 <div>
3322 <asp:TextBox ClientIDMode="Static" ID="txtMaxHR" runat="server" Text=""></asp:TextBox>
3323 @
3324 <asp:TextBox ClientIDMode="Static" ID="txtMaxHRDate" runat="server" Text=""></asp:TextBox>
3325 </div>
3326 </div>
3327 </div>
3328 </div>
3329
3330
3331 </div>
3332
3333 </div>
3334 <div id="EventsSection" class="box grid_12" style="display: none; background: white">
3335 <div class="box-head white-box-head">
3336 <h2>Events</h2>
3337 </div>
3338 <div class="box-content" style="height: auto!important;">
3339 <div id="EventsResult" class="EventsResult">
3340 </div>
3341 </div>
3342 </div>
3343
3344 <div style="display: none;" class="box grid_12" id="divHRAndBurdenGraphs">
3345 <div class="box-head white-box-head">
3346 <h2>Graphs</h2>
3347 </div>
3348 <div class="box-content" style="height: auto;">
3349 <div class="report-graphs">
3350 <div id="divHR">
3351 <div style="width: 100%;">
3352 <p>Heart Rate</p>
3353 <div class="report-hr-grouping">
3354 <select id="selectReportRDG">
3355 <option value="dgOneMinute" id="dgOneMinute">1 min</option>
3356 <option value="dgFifteenMinutes" id="dgFifteenMinutes" data-timeunit="minute" data-allowedmultiples="15">15 mins</option>
3357 <option value="dgThirtyMinutes" id="dgThirtyMinutes" data-timeunit="minute" data-allowedmultiples="30">30 mins</option>
3358 <option value="dgOneHour" id="dgOneHour" data-timeunit="hour" data-allowedmultiples="1">1 hour</option>
3359 <option value="dgOneDay" id="dgOneDay" data-timeunit="day" data-allowedmultiples="1">1 day</option>
3360 </select>
3361 </div>
3362 </div>
3363 <div id="containerHRChart" style="height: 250px;"
3364 class="ECGContainer">
3365 </div>
3366 </div>
3367 <div id="divBurden">
3368 <div style="width: 100%;">
3369 <p>Arrhythmia Burden</p>
3370 <div>
3371 <a id="btnExcludeBurdenGraph" class="event-included" href="#"></a>
3372 </div>
3373 </div>
3374 <div id="containerAFBurden" style="height: 350px; margin: 0; width: 95%; margin-left: 2%; margin-right: 2%;"
3375 class="ECGContainer">
3376 </div>
3377 </div>
3378 </div>
3379 </div>
3380
3381 </div>
3382 <div id="ClinicalFindings" style="display: none;" class="box grid_12">
3383 <div class="box-head white-box-head">
3384 <h2>Clinical Findings</h2>
3385 </div>
3386 <div class="box-content" style="height: 250px;">
3387 <div style="width: 100%; display: inline-block;">
3388 <p>Provider Name</p>
3389 <div>
3390 <input type="text" id="txtCustomProviderName" />
3391 </div>
3392 </div>
3393 <div style="width: 100%;">
3394 <div style="width: 45%;">
3395 <p>
3396 Analyst's Impressions
3397 </p>
3398 <textarea id="txtFindings" rows="5" maxlength="600" placeholder="Add Notes"></textarea>
3399 </div>
3400 <div style="width: 45%;">
3401 <p>
3402 Physician's Interpretation
3403 </p>
3404 <textarea id="txtPhysInterpretation" rows="5" maxlength="2000" placeholder="Add Notes"></textarea>
3405 </div>
3406 </div>
3407 <div>
3408 <button type="button" id="btnCreateReport" class="ui-button-save" style="float: left; height: 40px; margin-top: 10px; margin-right: 10px; display: none;">Create Report</button>
3409 <button id="btnSaveReport" class="ui-button-report" style="float: left; height: 40px; margin-top: 10px;">Save Report</button>
3410 <img id="imgReportInProgress" src="/js/plugins/mbextruder/elements/ajax-loader.gif" alt="Loading" style="margin-left: 20px; float: left; display: none; width: 32px; height: 32px; margin-top: 13px;" />
3411 </div>
3412 </div>
3413 </div>
3414
3415
3416 <div id="dlgOverRateDefinedEvents" style="width: auto; height: auto; margin: auto; display: none;">
3417 <p>You have chosen the following:</p>
3418 <br />
3419 <p id="dlgOverRateDefinedEvents1"></p>
3420 <p id="dlgOverRateDefinedEvents2"></p>
3421 <p id="dlgOverRateDefinedEvents3"></p>
3422 <p id="dlgOverRateDefinedEvents4"></p>
3423 <br />
3424 <p>Please choose one of each for Rate-defined events if it's possible.</p>
3425 </div>
3426 <div id="dlgNoteNoEvents" style="width: auto; height: auto; margin: auto; display: none;">
3427 <p>
3428 Please ensure that a number of events is selected and included in reporting.
3429 </p>
3430 </div>
3431 <div id="dlgNoteNoHR" style="width: auto; height: auto; margin: auto; display: none;">
3432 <p>
3433 No heart rate available for this study yet.
3434 </p>
3435 <p>
3436 Would you like to proceed?
3437 </p>
3438 </div>
3439 </div>
3440</asp:Content>