gerd
11/8/2016 - 1:46 PM

patientprofileTimeline.js

/**
 * This object will handle the episode Timeline chart
 * @class lexisnexis.component.patientprofileTimelineChart
 */
jQuery.namespace('lexisnexis.component');

jQuery.extend( jQuery.fn.dataTableExt.oSort,
        {
            "length-of-stay-asc" : function(a,b) {
                b = b.match('N/A') ? "-999" : b;
                a = a.match('N/A') ? "-999" : a;
                a = parseInt(a);
                b = parseInt(b);
                return ((a < b) ? -1 : ((a > b) ?  1 : 0));
            },
            "length-of-stay-desc" : function(a,b) {
                b = b.match('N/A') ? "-999" : b;
                a = a.match('N/A') ? "-999" : a;
                a = parseInt(a);
                b = parseInt(b);
                return ((a < b) ?  1 : ((a > b) ? -1 : 0));
            }
        });

lexisnexis.component.patientprofileTimelineChart = lexisnexis.component.Component.extend( {
    data : {
        chartDiv : '#patienttimeline',
        AJAX_URL : "getPatientTimelineChart",
        tableId : '#timelinetable',
        dataSetId : '#dataSet'
    },
    
    config:{canvasWidth :'80%', canvasHeight :'50%', style : 'box', showNavigation:true},
    
    /**
     * @method ready
     */
    ready : function() {
        // Parse out the relative U
        var cs=this;
        cs.data.isPatientProfile = $("#ln_isPatientProfileScreenFlag").val() ;        
        cs.getChartData();
    },
    
    prepareProcedureCodeData: function(cs,data){    	
    	if (data != null)
    	{
			var filterArray = data.split('^');
	    	var moreAnchor = '<a class="moreClickClass" href="#" onclick="return false;">...more</a>';
	        var lessAnchor = '<a class="lessClickClass" href="#" onclick="return false;">...less</a>';
	        	
			if (filterArray.length > 1)
			{
				// Need More /Less code here, put back in once I have it properly working in datatable
				var concatenatedString1 = "";
				var concatenatedString2 = "";
				concatenatedString1 += filterArray[0] + ' ' + moreAnchor ;
				concatenatedString2 += filterArray[0] + ' ' + lessAnchor ;
				
				for (var i = 1; i < filterArray.length; i++) {
					concatenatedString2 += "</BR>" + filterArray[i];
				}
				return '<div class="ln-procedureCodeList_moreLess"><span class="moreClass">'+concatenatedString1+' </span> <span class="lessClass" style="display: none;">'+concatenatedString2+'</span></div>';			
			}
			else
			{
				return '<div class="ln-procedureCodeList">'+data+'</div>';			
			}
    	}
		else
		{
			return '<div class="ln-procedureCodeList"></div>';			
		}
    },    
    
    getTimeLineData: function(data){
        var cs=this;
        var tData= data.aaData;
        
        cs.data.filteredCount= data.filteredCount;
        if(parseInt(cs.data.filteredCount) > 0){
            $('#errordiv').hide();
            $('#ln_patientProfile').show();
            LN.getPage().pushEvent(EVENT_TYPES.UPDATE_TABLE_DATA);
        }else {
            $('#ln_patientProfile').hide();
            $('#errordiv').show();
        }
        if(tData.length>0){
            var timelineData=[];
            var minDate= new Date(tData[tData.length-1][0]);
            minDate.setMonth(minDate.getMonth()-3); 
            minDate.setDate(01);
            var maxDate=new Date(tData[0][0]);
            maxDate.setDate(01);
            maxDate.setMonth(maxDate.getMonth()+4);
            maxDate.setDate(maxDate.getDate()-1);

            cs.data.minDate=minDate;
            cs.data.maxDate=maxDate;
            tData.forEach(function(d){
                var date= new Date(d[0]);
                var day= date.getDate();
                var month= date.getMonth();
                var year= date.getFullYear();
                var image='';
                switch(d[5].toLowerCase()){
                case "pharmacy":
                    image= "Pharmacy";
                    break;
                case "officevisit":
                    image="Office_visit";
                    break;
                case "emergency":
                    image="Emergency";
                    break;
                case "inpatient":
                    image="InPatient";
                    break;
                case "outpatient":
                    image="Outpatient_Surgery";
                    break;
                case "labs":
                    image="Lab";
                    break;
                case "radiology":
                    image="Radiology";
                    break;
                }
                var count=1;
                var timelineEntry={"startyear":year,"startmonth":month,"startdate":day,"image":image,"count":parseInt(count),"eventDate":date,"provider":d[4],"service":d[1],"diagCode":d[2],"code":d[3],"los":d[6],"eventCount":d[7], "diagDesc":d[8], "procedureCodes":d[9], "procedureDescriptions":d[10]};
                timelineData.push(timelineEntry);
            });
            cs.data.actualData= timelineData;
        }
    },
    getChartData : function(){
        var cs=this;
        //var dataSet = $(cs.data.dataSetId).val();
        var dataSet = $("#ln_topmenu_dataset").attr('datasetkey');
        var queryString = window.location.search;
        var url = LN.getContextPath()+"/getPatientTimelineChart";
        var serviceType = $('#serviceType').val();
        if(! (queryString.indexOf("&dataSet=") > -1)){
            url = url + queryString+"&dataSet="+ dataSet+"&serviceType="+serviceType;
        }else{
            var query = queryString.substring(0,queryString.indexOf("&dataSet="));
            url = url + "?" + query+"&dataSet="+ dataSet+"&serviceType="+serviceType;
        }
        var params=[];
        LN.ajaxPostJSON(cs.data.chartDiv,url,params,cs.callWebservice,cs);
    },
    
    /**
     * @method loadChart
     */
    loadChart: function() {
        var cs=this;
        cs.getChartData();
    },
    
    /**
     * @method callWebservice
     */
    callWebservice: function(cs,data,status){
        cs.getTimeLineData(data);
        cs.ajaxDisplayChartCallBack(cs, cs.data.actualData, '');
    },
    
    /**
     * function to display the chart
     */
    ajaxDisplayChartCallBack:function(cs,data,status) {
        cs.drawTimelineChart(cs.data.chartDiv, data);
    },
    /**
     * @method drawTimelineChart
     */
    drawTimelineChart: function(divId, data) {
        var cs=this;
        cs.drawVisualization(divId, data,cs.config, cs);
    },
    
    drawVisualization:function (divId, data, defaultConfig) {
    	
    	/*
    	 * [START] DECLARE NESTED FUNCTIONS 
    	 * */
    	function getVisTimelineChartData(data, isActualDate){
            var chartData=[];
            data.forEach(function(d){
                //var rowData=[];
                var chartDate= new Date(d.startyear, d.startmonth, '01');
                if(isActualDate){
                    chartDate.setDate(d.startdate);
                }
                var content='<img src="'+LN.getContextPath()+'/resources/default/images/'+d.image+'.png"> '+d.sum_count;
                var item={'start':chartDate,'content':content,'className':'ln-mousepointer'};                
                chartData.push( item);
            });
            return chartData;
        };
        //event listener function for range change event: zoom-in, zoom-out, right & left navigation
        function getVisibleChartRange(){
            var range = timeline.getWindow();
            var timeDiff= Math.abs((range.end).getTime()-(range.start).getTime());
            var dayDiff = Math.ceil(timeDiff/(1000*3600*24));
            var chartData=[];
            var options = {
                "width":  '100%',
                "autoResize":true,
                "minHeight":"25em",
                "min" : cs.data.minDate,
                "max" : cs.data.maxDate,
                "timeAxis":{scale:'month',step:1},
                "margin": {axis:5 ,item:{horizontal:5 ,vertical:5}},
                "zoomMin":604800000,
                "stack":true,
                "showMinorLabels":true,
                "editable":false,
                "type":"box"
            };
            if($('#serviceType').val() != '' && $('#serviceType').val()!="All" ){
                image=[];
                image.push(getServiceType($('#serviceType').val()));
            }

            //group data by event type, mont & date
            if(dayDiff<110){
                var result= SQLike.q({
                    Select: ['startyear','startmonth','startdate','end','image','|sum|','count'],
                    From: actualdata,
                    Where: function(){return image.indexOf(this.image)> -1 && new Date(this.startyear, this.startmonth, this.startdate).getTime()>=(range.start).getTime() && new Date(this.startyear, this.startmonth, this.startdate).getTime()<=(range.end).getTime();},
                    GroupBy:['image','startmonth','startdate'],
                    OrderBy:['image','|asc|']
                });    
                if(dayDiff>30){
                    options = {
                        "width":  '100%',
                        "autoResize":true,
                        "minHeight":"25em",
                        "min" : cs.data.minDate,
                        "max" : cs.data.maxDate,
                        "timeAxis":{scale:'day',step:5},
                        "margin": {axis:5 ,item:{horizontal:5 ,vertical:5}},
                        "zoomMin":604800000,
                        "stack":true,
                        "showMinorLabels":true,
                        "editable":false,
                        "type":"box"
                    };
                }else{
                    options = {
                        "width":  '100%',
                        "autoResize":true,
                        "minHeight":"25em",
                        "min" : cs.data.minDate,
                        "max" : cs.data.maxDate,
                        "timeAxis":{scale:'day',step:1},
                        "margin": {axis:5 ,item:{horizontal:5 ,vertical:5}},
                        "zoomMin":604800000,
                        "stack":true,
                        "showMinorLabels":true,
                        "editable":false,
                        "type":"box"
                    };
                }

                var chartData=getVisTimelineChartData(result, true);
            }else{  
                //group data by event type and month
                var result= SQLike.q({
                    Select: ['startyear','startmonth','startdate','end','image','|sum|','count'],
                    From: actualdata,
                    Where: function(){return image.indexOf(this.image)> -1 && new Date(this.startyear, this.startmonth, this.startdate).getTime()>=(range.start).getTime() && new Date(this.startyear, this.startmonth, this.startdate).getTime()<=(range.end).getTime();},
                    GroupBy:['image','startmonth','startyear'],
                    OrderBy:['image','|asc|']
                });
                var chartData=getVisTimelineChartData(result, false);
            }
            var items=new vis.DataSet(chartData);
            timeline.setItems(items);
            timeline.setOptions(options);
            // Draw our timeline with the created data and options
            timeline.redraw();
        };
        function getSelectedItem(properties){
            var data= timeline.itemsData.get(properties.item);
            var selectedItemDate= new Date(data.start);
            var selectedItemContent= data.content.split('/');
            var image=selectedItemContent[selectedItemContent.length-1].split('>')[0];
            image= image.split(".")[0];
            var range = timeline.getWindow();
            var timeDiff= Math.abs((range.end).getTime()-(range.start).getTime());
            var dayDiff = Math.ceil(timeDiff/(1000*3600*24));
            var result;
            var options = {
                "width":  '100%',
                "autoResize":true,
                "minHeight":"25em", 
                "min" : cs.data.minDate,
                "max" : cs.data.maxDate,
                "timeAxis":{scale:'month',step:1},
                "margin": {axis:5 ,item:{horizontal:5 ,vertical:5}},
                "zoomMin":604800000,
                "stack":true,
                "showMinorLabels":true,
                "editable":false,
                "type":"box"
            };
            //if the visible range is less than 110 days split the events to day level and display the timeline chart.
            if(dayDiff<110){
                result = SQLike.q({
                    Select: ['startyear','startmonth','startdate','end','image','eventDate','provider','service','diagCode','code','los','eventCount','diagDesc', 'procedureCodes','procedureDescriptions'],
                    From: actualdata,
                    Where: function(){return image.indexOf(this.image)> -1 && new Date(this.startyear, this.startmonth, this.startdate).getTime()>=selectedItemDate.getTime() && new Date(this.startyear, this.startmonth, this.startdate).getTime()<=selectedItemDate.getTime();},
                    OrderBy:['image','|asc|']
                });
                options = {
                    "width":  '100%',
                    "autoResize":true,
                    "minHeight":"25em",
                    "min" : cs.data.minDate,
                    "max" : cs.data.maxDate,
                    "timeAxis":{scale:'day',step:1},
                    "margin": {axis:5 ,item:{horizontal:5 ,vertical:5}},
                    "zoomMin":604800000,
                    "stack":true,
                    "showMinorLabels":true,
                    "editable":false,
                    "type":"box"
                };
             }else{
                 var startDate= new Date(selectedItemDate.getFullYear(), selectedItemDate.getMonth(),'01');
                 var endDate= new Date(selectedItemDate.getFullYear(), selectedItemDate.getMonth(),'01');
                 endDate.setMonth(endDate.getMonth()+1);
                 endDate.setDate(endDate.getDate()-1);
                 result= SQLike.q({
                     Select: ['startyear','startmonth','startdate','end','image','eventDate','provider','service','diagCode','code','los','eventCount','diagDesc', 'procedureCodes','procedureDescriptions'],
                     From: actualdata,
                     Where: function(){return image.indexOf(this.image)> -1 && new Date(this.startyear, this.startmonth, this.startdate).getTime()>=startDate.getTime() && new Date(this.startyear, this.startmonth, this.startdate).getTime()<=endDate.getTime();}
                 });   
             }
        	 var viewwidth = $(window).width();
             switch (image){
             case "Pharmacy":
            	 viewwidth < 1025 ? $("#pharmacy").removeClass("w60").addClass("w90") : $("#pharmacy").removeClass("w90").addClass("w60");
                 showPharmacyModal(result);
                 break;
             case "Office_visit":
            	 viewwidth < 1250 ? $("#officeVisit").removeClass("w70").addClass("w90") : $("#officeVisit").removeClass("w90").addClass("w70");
                 showOfficeVisitModal(result);
                 break;
             case "Emergency":
            	 viewwidth < 1250 ? $("#emergency").removeClass("w80").addClass("w90") : $("#emergency").removeClass("w90").addClass("w80");
                 showEmergencyModal(result);
                 break;
             case "InPatient":
            	 viewwidth < 1250 ? $("#inpatient").removeClass("w80").addClass("w90") : $("#inpatient").removeClass("w90").addClass("w80");
                 showInpatientModal(result);
                 break;
             case "Outpatient_Surgery":
            	 console.log(viewwidth);
            	 viewwidth < 1750 ? $("#outpatient").removeClass("w80").addClass("w90") : $("#outpatient").removeClass("w90").addClass("w80");
                 showOutpatientModal(result);
                 break;
             case "Lab":
            	 viewwidth < 1100 ? $("#lab").removeClass("w60").addClass("w80") : $("#lab").removeClass("w80").addClass("w60");
                 showLabModal(result);
                 break;
             case "Radiology":
            	 viewwidth < 1300 ? $("#radiology").removeClass("w70").addClass("w90") : $("#radiology").removeClass("w90").addClass("w70");
                 showRadiologyModal(result);
                 break;
             }
         };
         function move (percentage) {
             var range = timeline.getWindow();
             var interval = range.end - range.start;

             timeline.setWindow({
                 start: range.start.valueOf() - interval * percentage,
                 end:   range.end.valueOf()   - interval * percentage
             });
         };
         function zoom (percentage) {
             var range = timeline.getWindow();
             var interval = range.end - range.start;

             timeline.setWindow({
                 start: range.start.valueOf() - interval * percentage,
                 end:   range.end.valueOf()   + interval * percentage
             });
         };
         function formatedDate(date){
             var monthPad = ((date.getMonth() + 1) < 10 ) ? '0' : '';
             var datePad = ((date.getDate()) < 10 ) ? '0' : '';
             return [monthPad,(date.getMonth() + 1),"/",
                     datePad,date.getDate(),"/",
                     date.getFullYear()].join('');
         };
         
         /* added for patient profile screen  */
         function startClickEvent(){ 
         	$(".moreClickClass").on('click', function(e){
         			$(this).closest('.ln-procedureCodeList_moreLess').find('.moreClass').hide();
         			$(this).closest('.ln-procedureCodeList_moreLess').find('.lessClass').show();
         	});
         	
         	$(".lessClickClass").on('click', function(e){
     			$(this).closest('.ln-procedureCodeList_moreLess').find('.lessClass').hide();
     			$(this).closest('.ln-procedureCodeList_moreLess').find('.moreClass').show();
         	});
         };
         
         function populateDatatable(id,dataSet,options,orderBy,columnDefs){        	 
        	 setTimeout(function(){
        		 $(id).dataTable({
                     "data":dataSet,
                     "ordering": true,
                     "searching": false,
                     "paging":false,
                     'scrollY' : '200px',
                     "sScrollX" : "100%",
                     "sScrollXInner" : "100%",
                     'scrollCollapse' : true,
                     'dom' : 'rt',
                     "bLengthChange" : false,
                     "autoWidth" : true,
                     "processing" : false,
                     'responsive' : true,
                     "bAutoWidth" : false,
                     "columns": options,
                     "order":orderBy,
                     "columnDefs" : columnDefs,
                     "fnDrawCallback" : function(oSettings) {
                         startClickEvent();
                     }
                 });
        	 },200);                      
         };
         
         function displayModal(divId, tblId, dataSet, options, orderBy, columnDefs){                        
             $(divId).modal('show');    
             $(tblId).dataTable().fnDestroy();
             populateDatatable(tblId, dataSet,options,orderBy,columnDefs);
         };    
         function showPharmacyModal(data){
             var dataSet=[];
             var classOptions=[{'className':'ln-nowrap'},null,null];
             var orderBy =[[0,"desc"]];
             var columnDefs =[{"targets" : [0], "orderSequence" : ['desc','asc']}];

             data.forEach(function(d){
                 var entry=[formatedDate(d.eventDate), d.service, d.provider];
                 dataSet.push(entry);
             });
             
             
             displayModal('#pharmacy','#pharmacytbl', dataSet,classOptions,orderBy,columnDefs);
         };
         function showOfficeVisitModal(data){
             var dataSet=[];
             var classOptions=[{'className':'ln-nowrap'},null,{'className':'text-center'},{'className':'text-center ln-nowrap'},null];
             var orderBy =[[0,"desc"]];
             var columnDefs =[{"targets" : [0], "orderSequence" : ['desc','asc']}];
             data.forEach(function(d){
                 var entry=[formatedDate(d.eventDate), d.service,d.diagCode, d.code, d.provider];
                 dataSet.push(entry);
             });
            
             displayModal('#officeVisit','#officeVisittbl', dataSet,classOptions,orderBy,columnDefs);
         };
         function showEmergencyModal(data){
             var dataSet=[];
             var classOptions=[null,null,{'className':'text-center'},{'className':'text-center ln-nowrap'},null];
             var orderBy =[[0,"desc"]];
             var columnDefs =[ 
                     {"targets" : [0], "orderSequence" : ['desc','asc'], "width":"15%"},
                     {"targets" : [1], "width":"33%"},
                     {"targets" : [2], "width":"15%"},
                     {"targets" : [3], "width":"10%"},
                     {"targets" : [4], "width":"27%"}
             ];
             data.forEach(function(d){
                 var entry=[formatedDate(d.eventDate), d.service,d.diagCode, d.code, d.provider];
                 dataSet.push(entry);
             });
             displayModal('#emergency','#emergencytbl', dataSet,classOptions,orderBy,columnDefs);
         };
         function showInpatientModal(data){
             var dataSet=[];
             var classOptions=[null,{'className':'text-center'},{'className':'text-center'},null,null,{'className':'text-center'},null];
             var orderBy =[[3,"desc"]];
             var columnDefs =[{"targets" : [3,4,5], "orderSequence" : ['desc','asc']}];
             data.forEach(function(d){
                 var admitDate= new Date(d.eventDate);
                 admitDate.setDate(admitDate.getDate()-parseInt(d.los));
                 var entry=[d.service, d.diagCode, d.code, formatedDate(admitDate), formatedDate(d.eventDate), d.los, d.provider];
                 dataSet.push(entry);
             });
             displayModal('#inpatient','#inpatienttbl', dataSet,classOptions,orderBy,columnDefs);
         };
         function showOutpatientModal(data){
             var dataSet=[];
             var classOptions=[null,null,null,null,null,null];
             var orderBy =[[0,"desc"]];
             var columnDefs =[{"targets" : [0], "orderSequence" : ['desc','asc'], "width": "1%" },
                              {"render" : function(data, type, row) {
            	 						return cs.prepareProcedureCodeData(cs,data);
            	 			  },
								"width": "4%",  
            	 				"targets" : [ 1 ]
                              },
                              
                              {"width": "3%", "targets" : 2},
                              {"width": "1%", "targets" : [ 3, 4 ], "className": "text-center"},
                              {'width': '2%', "targets" : 5 } 
								
                             ];
             data.forEach(function(d){
                 var entry=[formatedDate(d.eventDate), d.procedureDescriptions, d.diagDesc, d.diagCode, d.code, d.provider];
                 dataSet.push(entry);
             });
             displayModal('#outpatient','#outpatienttbl', dataSet,classOptions,orderBy,columnDefs);
         };
         function showLabModal(data){
             var dataSet=[];
             var classOptions=[{'className':'ln-nowrap'},null,null];
             var orderBy =[[0,"desc"]];
             var columnDefs =[{"targets" : [0], "orderSequence" : ['desc','asc']}];
             data.forEach(function(d){
                 var entry=[formatedDate(d.eventDate), d.service, d.provider];
                 dataSet.push(entry);
             });
             displayModal('#lab','#labtbl', dataSet,classOptions,orderBy,columnDefs);
         };
         function showRadiologyModal(data){
             var dataSet=[];
             var classOptions=[null,{'className':'ln-nowrap'},null,{'className':'text-center'}];
             var orderBy =[[1,"desc"]];
             var columnDefs =[{"targets" : [1,3], "orderSequence" : ['desc','asc']}];
             data.forEach(function(d){
                 var entry=[d.provider, formatedDate(d.eventDate), d.service, d.eventCount];
                 dataSet.push(entry);
             });
             displayModal('#radiology','#radiologytbl', dataSet,classOptions,orderBy,columnDefs);
         };
         function getTimelineChartData(data, isActualDate){
             var chartData=[];
             data.forEach(function(d){
                 var rowData=[];
                 var chartDate= new Date(d.startyear, d.startmonth, '01');
                 if(isActualDate){
                     chartDate.setDate(d.startdate);
                 }
                 rowData.push(chartDate);
                 rowData.push('<img src="'+LN.getContextPath()+'/resources/default/images/'+d.image+'.png"> '+d.sum_count);
                 rowData.push('ln-mousepointer');
                 chartData.push( rowData);
             });
             return chartData;
         };
         function getServiceType(data){
             var image='false';
             switch(data.toLowerCase()){
             case "pharmacy":
                 image= "Pharmacy";
                 break;
             case "office":
                 image="Office_visit";
                 break;
             case "emergency":
                 image="Emergency";
                 break;
             case "inpatient":
                 image="InPatient";
                 break;
             case "outpatient":
                 image="Outpatient_Surgery";
                 break;
             case "lab":
                 image="Lab";
                 break;
             case "radiology":
                 image="Radiology";
                 break;
             }
             return image;
         };
        /*
    	 * [END] DECLARE NESTED FUNCTIONS
    	 * 
    	 *  BELOW HERE IS THE "REAL CODE"
    	 * 
    	 */


        // Create and populate a data table.
        var cs= this;
        cs.data.actualdata=data;
        var actualdata =data;
        var timelineData= cs.data.timelineData;
        var serviceType='';
        if(typeof $('#serviceType').val() != 'undefined'){
            serviceType=$('#serviceType').val();
        }
        if(typeof actualdata == 'undefined'){
            $('#errorBlock').show();
            $('#patienttimelinelegend').hide();
            $('#navigation').hide();
            $(".vis").remove();
        }else{
            $('#errorBlock').hide();
            //var image = ["Pharmacy", "Office_visit", "Emergency", "InPatient", "Outpatient_Surgery", "Lab", "Radiology"];
            var image = new Array("Pharmacy", "Office_visit", "Emergency", "InPatient", "Outpatient_Surgery", "Lab", "Radiology"); 
            if(serviceType.length>0 && serviceType !="All"){
              image=[];
              image.push(getServiceType(serviceType));
            }
            var result= SQLike.q({
              Select: ['startyear','startmonth','|min|','startdate','image','|sum|','count'],
              From: actualdata,
              Where: function(){return image.indexOf(this.image)> -1 ;},
              GroupBy:['image','startmonth','startyear'],
              OrderBy:['image','|asc|','min_startdate','|asc|','startmonth','|asc|']
            });

            var chartData= getVisTimelineChartData(result, false);

            //setting the options for the time line chart
            var options = {
                "width":  '100%',
                "autoResize":true,
                "minHeight":"25em",
                "min" : cs.data.minDate,
                "max" : cs.data.maxDate,
                "timeAxis":{scale:'month',step:1},
                "margin": {axis:5 ,item:{horizontal:5 ,vertical:5}},
                "zoomMin":604800000,
                "stack":true,
                "showMinorLabels":true,
                "editable":false,
                "type":"box"
            };
            // Instantiate our timeline object.
            $(".vis").remove();
            if(chartData[0] == undefined){
                $('#errorBlock').show();
                $('#patienttimelinelegend').hide();
                $('#navigation').hide();
            } else {
                $('#errorBlock').hide();
                $('#patienttimelinelegend').show();
                $('#navigation').show();
                var container= document.getElementById('patienttimeline');
                var items=new vis.DataSet(chartData);
                // Draw our timeline with the created data and options
                var timeline = new vis.Timeline(container, items, options);

                //setting the visible range on load
                timeline.setWindow(cs.data.minDate, cs.data.maxDate);

                //adding event listener for range change event.
                timeline.on('rangechange',getVisibleChartRange);
                timeline.on('click',getSelectedItem);
            }

            // attach events to the navigation buttons
            document.getElementById('zoomIn').onclick    = function () { zoom(-0.2); };
            document.getElementById('zoomOut').onclick   = function () { zoom( 0.2); };
            document.getElementById('moveLeft').onclick  = function () { move( 0.2); };
            document.getElementById('moveRight').onclick = function () { move(-0.2); };
            
        }
    }
});

lexisnexis.component.patientprofileTimelineTable = lexisnexis.component.Table.extend({
    data : {
        defaultOrder : [ 0, 1, 2, 3, 4, 5,6],
        isPdf : false,
        ajaxComplete : false
    },
    ready : function() {
    	var cs = this;
    	cs.checkPatientMemberId(cs, cs.onReadyFn);
        LN.getPage().registerEvent(EVENT_TYPES.APPLY_BUTTON_CLICK,cs,cs.onDataSetChange);
    },
    
    onReadyFn: function(cs){
    	cs.setDefaultColumnsPref();
        cs.onServiceChange();
        $('#errordiv').hide();
        $('#errorBlock').hide();
        var patienttimeline = cs.getPatientTimeline();

        try {
            cs.initializeTable();
            
            //DE1438
            if($('#serviceType').val() != '' && $('#serviceType').val() !='All'){
                $('#timelinetable').DataTable().column(5).search( $('#serviceType').val() ).draw();
            }else{
                $('#timelinetable').DataTable().draw();
            }
            if (patienttimeline != null) {
                patienttimeline.loadChart();
            }
        } catch (err) {
            LN.debug("error in datatable" + err);
        }
    },
    
    onDateSetChangeFn: function(cs){
    	var patienttimeline = cs.getPatientTimeline();
        if (patienttimeline != null) {
            patienttimeline.loadChart();
        }
        var dataSet = $(cs.data.dataSetId).val();
        var queryString = window.location.search;
        if(queryString.indexOf("&dataSet=") > -1){
            queryString = ["?",queryString.substring(0,queryString.indexOf("&dataSet="))].join('');
        }
        var url = [LN.getContextPath(),"/getPatientTimelineTable",queryString,"&dataSet=",dataSet].join('');
        cs.initializeTable();
        if($('#serviceType').val() != '' && $('#serviceType').val() !='All'){
        	$('#timelinetable').DataTable().column(5).search( $('#serviceType').val() ).draw();
        }else{
        	$('#timelinetable').DataTable().draw();
        }
    },
    
    getClientParameters: function(cs){
		$.ajax({
			  url: LN.getContextPath()+'/getOverallefficiencyParameters',
			  method: 'POST',
			  async: true,
			  cache:true,	   
			  dataType : "json",
			  success: function(response){
				  if(response){
					  _.each(response, function(resp) {   
						  if(resp.name==='PPM_OVERALL_EFFICIENCY_HIGH'){
							  cs.data.overallEfficiencyHigh=resp.value;
						  }else if(resp.name==='PPM_OVERALL_EFFICIENCY_LOW'){
							  cs.data.overallEfficiencyLow=resp.value;
						  }
			          	});	
				  }
				
			  },
			  error: function(data){
				  cs.data.overallEfficiencyHigh='0';
				  cs.data.overallEfficiencyLow='0';
			  },
			  
			  complete: function(){
				  cs.populatPatientPCPInfo(cs);
			  }
	 	 });
		
	},
    
    populatPatientPCPInfo: function(cs) {
      	$.ajax({
      		beforeSend: function() {
      			
      			LN.showAjaxIndicator("#patient_profile_pcp");
      		},
          	url: LN.getContextPath()+"/getPatientProfilePCPInfo",
          	data: {
          		getPatientProviderKey: true
          	},
          	method: 'POST',
          	dataType: 'json',
          	success: function(response) {
          		cs.colorCodeTotalsTable(cs, response);
         		var summaryTotalsTemplate = $("#patient_profile_pcp_template").html();
       		    var summaryTotalsHtml = Mustache.to_html(summaryTotalsTemplate, response);
       		    $("#patient_profile_pcp").html(summaryTotalsHtml);
       		 
          	},
          	error : function(err){     			
      			$('#patient_profile_pcp').html('<span style="color:red">Error: Data is currently unavailable.</span>');
      		},
          	complete: function(data){
          		LN.hideAjaxIndicator("#patient_profile_pcp");
          	}
          });
      },    
    
    checkPatientMemberId: function(cs, callBackFn){
    	var ajaxURL = [LN.getContextPath()+"/patientProfileMemberKey?selDataSet=" +$('#ln_topmenu_dataset').attr('datasetkey')];

    	$.ajax({
            'url': ajaxURL,
            'contentType': 'application/json',
            'dataType': 'json',
            'method': 'post',
            'data': JSON.stringify({
              "selDataSet":$('#ln_topmenu_dataset').attr('datasetkey')
            }),
            'success': function(data, textStatus, jqXHR) {
                try {
               	 var patientProfileJson = JSON.stringify(data);
               	 
               	 var patientMemberMemberCount =  data.patientProfileMemberKeyResponseDTO.patientMemberCount;
               	 var patientName =  data.patientProfileMemberKeyResponseDTO.patientName;
               	 var policyHolderId =  data.patientProfileMemberKeyResponseDTO.policyHolderId;
               	 
               	 $('#ln_patientName').html(patientName);
               	 $('#ln_patientProfileTimelineDiv').removeClass("ln-display-none");
                	
               	 if(parseInt(patientMemberMemberCount) > 0){
               		 LN.hideAjaxIndicator($('#ln_patientProfileTimelineDiv'));
               		 	$('#ln_patientProfileTimelineDiv').show();
                        $('#patientProfileTimelineErrordiv').hide();
                        
                        callBackFn(cs);
                        cs.getClientParameters(cs);                        
                        
                    }else {
                        $('#ln_patientProfileTimelineDiv').hide();
                        $('#patientProfileTimelineErrordiv').show();
                    } 
                } catch(err) {
                    LN.debug("error ="+err);
                }
            },
            'beforeSend' : function() {
                LN.showAjaxIndicator("#ln_patientProfileTimelineDiv");
                LN.showAjaxIndicator("#patientProfileTimelineErrordiv");
            },
            'complete':function() { 
           	 LN.hideAjaxIndicator("#ln_patientProfileTimelineDiv");
           	 LN.hideAjaxIndicator("#patientProfileTimelineErrordiv");
           	
            },
            'error': function(jqXHR, textStatus, errorThrown) {
               
            }
        }); 
    },
    
    getPatientTimeline : function() {
        var cs = this;
        if (!cs.data.isPdf) {
            return patienttimeline = new lexisnexis.component.patientprofileTimelineChart({
                data : {
                    dataSetId : '#dataSet',
                    chartDiv : '#patienttimeline',
                    tableId : '#timelinetable'
                }
            });
        }
        return null;
    },
    onDataSetChange : function(cs) {
    	cs.checkPatientMemberId(cs, cs.onDateSetChangeFn);
    },
    onServiceChange:function(){
        var cs=this;  
        $('#serviceType').on('change', function(event){
        	cs.initializeTable();
        	if($('#serviceType').val() != '' && $('#serviceType').val() !='All'){
            	$('#timelinetable').DataTable().column(5).search( $('#serviceType').val() ).draw();
            }else{
            	$('#timelinetable').DataTable().draw();
            }
            var patienttimeline = cs.getPatientTimeline();
            if (patienttimeline != null) {
                patienttimeline.loadChart();
            }
        });
    },

    /* added for patient profile screen  */
    startClickEvent2 : function(){ 
    	$(".moreClickClass").on('click', function(e){
    			$(this).closest('.ln-procedureCodeList_moreLess').find('.moreClass').hide();
    			$(this).closest('.ln-procedureCodeList_moreLess').find('.lessClass').show();
    	});
    	
    	$(".lessClickClass").on('click', function(e){
			$(this).closest('.ln-procedureCodeList_moreLess').find('.lessClass').hide();
			$(this).closest('.ln-procedureCodeList_moreLess').find('.moreClass').show();
    	});
    },
    
    initializeTable : function() {
        var cs = this;
        cs.data.ajaxComplete = false;
        var queryString = window.location.search;
        var dataSet = $(cs.data.dataSetId).val();
        var url = [LN.getContextPath(),"/getPatientTimelineTable",queryString,"&dataSet=",dataSet].join('');

        //var prevColumnNamesArray=cs.getCurrentColumnNamesArray();
        LN.debug("initializeTable called");
        $(cs.data.tableId).dataTable().fnDestroy();
        cs.data.table = $(cs.data.tableId).dataTable({
            'scrollY' : '200px',
            "sScrollX" : "100%",
            "sScrollXInner" : "100%",
            'scrollCollapse' : true,
            "iDisplayLength" : 100,
            'dom' : 'rt',
            "bLengthChange" : false,
            "autoWidth" : true,
            "processing" : false,
            'responsive' : true,
            'paging'    : false,
            "bAutoWidth" : true,
            "ajax" : {
                "url" : url,
                "method" : "POST",
                "dataType" : "json",
                'beforeSend': function(xhr) {
                    xhr.setRequestHeader('X-TransactionID', LN.TRANSACTION_ID);
                    cs.handleBeforeAjax(cs);
                },
                'complete' : function() { 
                	cs.handleAfterComplete(cs);
                	cs.data.ajaxComplete = true;
                    cs.startClickEvent2();
                	
                },
                "data" : function(d) {
                    //var columnNamesArray=cs.getCurrentColumnNamesArray();
                    return $.extend({}, d, {
                       // "columnNames":columnNamesArray.length>0?columnNamesArray:prevColumnNamesArray
                    });
                }
            },
            "order" : [[0, "desc"]],
            "aoColumns" : [ {
                sWidth : '8%'
            },{
                sWidth : '11%'
            },{
                sWidth : '25%'
            },{
                sWidth : '11%'
            },{
                sWidth : '25%'
            },{
                sWidth : '12%'
            },{
                sWidth : '8%',
                sType : 'length-of-stay'
            }],
            'columnDefs' : [
                {
                	"targets" : [0],
                    "orderSequence" : ['desc','asc']
                }, {
                    "render" : function(data) {
                        return data;
                    },
                    "targets" : [1,3],
                    "className": "text-center"
                }, {
                    "render" : function(data) {
                    	if (data != null)
                    	{
	                		var filterArray = data.split('^');
	                    	var moreAnchor = '<a class="moreClickClass" href="#" onclick="return false;">...more</a>';
	                        var lessAnchor = '<a class="lessClickClass" href="#" onclick="return false;">...less</a>';
	                    	
	                		if (filterArray.length > 1)
	                		{
	                			// Need More /Less code here, put back in once I have it properly working in datatable
	                			var concatenatedString1 = "";
	                			var concatenatedString2 = "";
	                			concatenatedString1 += filterArray[0] + ' ' + moreAnchor ;
	                			concatenatedString2 += filterArray[0] + ' ' + lessAnchor ;
	                			
	                			for (var i = 1; i < filterArray.length; i++) {
	                				concatenatedString2 += "</BR>" + filterArray[i];
	                			}
	                			return '<div class="ln-procedureCodeList_moreLess"><span class="moreClass">'+concatenatedString1+' </span> <span class="lessClass" style="display: none;">'+concatenatedString2+'</span></div>';			
	                		}
	                		else
	                		{
	                			return '<div class="ln-procedureCodeList">'+data+'</div>';			
	                		}
                    	}
                		else
                		{
                			return '<div class="ln-procedureCodeList"></div>';			
                		}
                    },
                    "targets" : [2]                
                }, {
                    "render" : function(data) {
                        if(data == "Officevisit"){
                            return "Office Visit";
                        } else if(data == "Outpatient"){
                            return "Outpatient Surgery";
                        } else if(data == "Labs"){
                            return "Lab Services";
                        }
                           
                        return data;
                    },
                    "targets" : [5],
                    "searchable": true,
                    "sortable": true
                }
            ],
            "fnDrawCallback" : function(oSettings) {
                cs.handleDrawCallback(oSettings, cs);
            }
        });
    }
});
$(window).bind("load", function() {
   // LN.setupHelpDialog('#patientHistHelp', 'PATIENT_TIMELINE_HISTORY_HLP', 'Patient History');
	
});