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