Initial OpenECOMP Portal commit
[portal.git] / ecomp-portal-BE / war / static / ebz / angular_js / ui-charts-tpls.js
diff --git a/ecomp-portal-BE/war/static/ebz/angular_js/ui-charts-tpls.js b/ecomp-portal-BE/war/static/ebz/angular_js/ui-charts-tpls.js
new file mode 100644 (file)
index 0000000..41d1bf6
--- /dev/null
@@ -0,0 +1,3909 @@
+/*Sandbox version 0.0.41a*/
+angular.module("att.charts", ["att.charts.tpls", "att.charts.utilities","att.charts.areachartD3","att.charts.barchartD3","att.charts.coschartD3","att.charts.coschartwithbarD3","att.charts.cosdeletionD3","att.charts.cosmultichartD3","att.charts.donutD3","att.charts.donutFusion","att.charts.horseshoeD3","att.charts.radialguageD3","att.charts.stackedBarchart","att.charts.stackedareachart"]);
+angular.module("att.charts.tpls", ["template/areachartD3/attAreaChartD3.html","template/barchartD3/attBarChartD3.html","template/coschartD3/attCosd3Chart.html","template/coschartwithbarD3/attCosBarD3Chart.html","template/cosmultichartD3/attCosmultid3Chart.html","template/donutD3/attDonutd3Chart.html","template/donutFusion/attDonutfusionChart.html","template/horseshoeD3/attHorseshoeD3Chart.html","template/stackedBarchart/stackedBarchart.html","template/stackedareachart/stackedAreaChart.html"]);
+angular.module('att.charts.utilities', [])
+        .factory('$extendObj', [function () {
+                var _extendDeep = function (dst) {
+                    angular.forEach(arguments, function (obj) {
+                        if (obj !== dst) {
+                            angular.forEach(obj, function (value, key) {
+                                if (dst[key] && dst[key].constructor && dst[key].constructor === Object) {
+                                    _extendDeep(dst[key], value);
+                                } else {
+                                    dst[key] = value;
+                                }
+                            });
+                        }
+                    });
+                    return dst;
+                };
+                return {
+                    extendDeep: _extendDeep
+                    
+                };
+            }]);
+
+angular.module('att.charts.areachartD3', ['att.charts.utilities'])
+        .constant("areaChartConfig",
+                {
+                    "chartcolor": {
+                        "areaChartColor": ["#bff1ec", "#bbf0eb", "#00c7b2"],
+                        "lineChartColor": ["#444444", "#444444"],
+                        "overageColor": ["#b8509e"]
+                    },
+                    "gridLineColor": "#808080",
+                    "lineCurveType": 'cardinal',
+                    "yAxisMaxTicks": 4,
+                    "chartHeight": "200",
+                    "dataType": "GB",
+                    "lineStroke": 3,
+                    "opacityOnHover": "0.5",
+                    "circleRadius": 3.5,
+                    "yearLabelPos": [5, -5],
+                    "tooltipTopMargin": 105,
+                    "tooltipLeftMargin": 28,
+                    "amountKDivision": 1000,
+                    "amountKText": "K",
+                    "amountMDivision": 1000000,
+                    "amountMText": "M"
+                })
+        .directive('attAreaChart', ['areaChartConfig', '$extendObj', '$timeout', function (areaChartConfig, $extendObj, $timeout) {
+                return {
+                    restrict: 'A',
+                    scope: {
+                        chartData: '=',
+                        chartColor: "=",
+                        legendLabel: "=",
+                        refreshChart: "=",
+                        chartConfig: "="
+                    },
+                    templateUrl: "template/areachartD3/attAreaChartD3.html",
+                    replace: true,
+                    controller: ['$scope', '$attrs', function ($scope, $attrs) {
+                            if (angular.isDefined($scope.chartConfig)) {
+                                areaChartConfig = $extendObj.extendDeep(areaChartConfig, $scope.chartConfig);
+                            }
+                            $scope.dataType = areaChartConfig.dataType;
+                            $scope.chartID = $attrs.id;
+                        }],
+                    link: function (scope, element, attrs, ctrl) {
+                        scope.tooltipFlag = false;
+                        scope.overageFlag = false;
+                        scope.underageFlag = false;
+                        var startColor, stopColor, lineColor, xAxisticks, dataObj, margin = {top: 30, right: 15, bottom: 30, left: 40},
+                        width = parseInt(attrs.chartWidth, 10),
+                                height = areaChartConfig.chartHeight,
+                                parseDate = d3.time.format("%d-%b-%Y").parse,
+                                tooltipFormat = d3.time.format("%B-%Y"),
+                                labelFormat = d3.time.format("%Y");
+                        var legendColors = [];
+                        legendColors = (scope.chartColor) ? scope.chartColor : areaChartConfig.chartcolor;
+                        startColor = legendColors.areaChartColor[0];
+                        stopColor = legendColors.areaChartColor[1];
+                        lineColor = legendColors.lineChartColor[0];
+                        scope.areaLegendColor = legendColors.areaChartColor[2];
+                        scope.lineLegendColor = legendColors.lineChartColor[1];
+                        scope.overageLegend = legendColors.overageColor[0];
+                        var oldIE = navigator.userAgent.toLowerCase().indexOf('msie 8.0') !== -1;
+                        scope.addLegendColor = function (id) {
+                            var bgColor = null;
+                            switch (id) {
+                                case 0:
+                                    bgColor = {"background-color": scope.areaLegendColor, "border-radius": "100%"};
+                                    break;
+                                case 1:
+                                    bgColor = {"background-color": scope.lineLegendColor};
+                                    break;
+                                case 2:
+                                    bgColor = {"background-color": scope.overageLegend, "border-radius": "100%"};
+                                    break;
+                            }
+                            return bgColor;
+                        };
+
+                        attrs.$observe('legendRequired', function (val) {
+                            if (val === 'true') {
+                                scope.showLegend = true;
+                            }
+                            else {
+                                scope.showLegend = false;
+                            }
+                        });
+
+                        scope.$watch('refreshChart', function (value) {
+                            if (value === false) {
+                                return;
+                            }
+                            if (angular.isDefined(scope.chartConfig)) {
+                                areaChartConfig = $extendObj.extendDeep(areaChartConfig, scope.chartConfig);
+                            }
+                            d3.select("svg#" + attrs.id).remove();
+                            d3.selectAll("svg#" + attrs.id + " > *").remove();
+                            d3.selectAll("div#areaChartContainer" + " > div").remove();
+                            xAxisticks = scope.chartData.length;
+                            dataObj = scope.chartData;
+                            var yearLabel = '', monthArr = {}, isSingleMonth, singleMonthName;
+
+                            //  On selecting same month in From and To dropdowns, User should be getting graph                            
+                            if (dataObj.length === 1) {
+                                isSingleMonth = true;
+                                var tmp1 = "01-" + dataObj[0].month;
+                                var tmp = parseDate(tmp1);
+                                singleMonthName = tmp.toString().split(" ")[1];
+                                tmp.setMonth(tmp.getMonth() + 1);
+                                var nextMonth = tmp.toString().split(" ")[1] + "-" + tmp.getFullYear();
+                                dataObj.push({month: nextMonth, usage: dataObj[0].usage, available: dataObj[0].available, usageDataType: dataObj[0].usageDataType, availableDataType: dataObj[0].availableDataType});
+                            }
+
+                            dataObj.forEach(function (d) {
+                                var tmp = "01-" + d.month;
+                                d.numericMonth = parseDate(tmp);
+                                d.usage = +d.usage;
+                                d.available = +d.available;
+                                monthArr[labelFormat(d.numericMonth)] = labelFormat(d.numericMonth);
+                            });
+
+                            for (var key in monthArr) {
+                                var label = monthArr[key];
+                                if (!yearLabel) {
+                                    yearLabel = label;
+                                }
+                                else {
+                                    if (!isSingleMonth) {
+                                        yearLabel = yearLabel + "-" + label;
+                                    }
+                                }
+                            }
+
+                            //X-Axis Range        
+                            var xRange = d3.time.scale()
+                                    .range([0, width]);
+
+                            //Y-Axis Range 
+                            var yRange = d3.scale.linear()
+                                    .range([height, 0]);
+
+                            //X-Axis Domain  
+                            xRange.domain(d3.extent(dataObj, function (d) {
+                                return d.numericMonth;
+                            }));
+
+                            //Y-Axis Domain
+                            var yDomainData = [], yAxisData = [];
+                            for (var b = 0; b < dataObj.length; b++) {
+                                var usageVal = Math.round(parseInt(dataObj[b].usage, 10) / areaChartConfig.yAxisMaxTicks);
+                                var availableVal = Math.round(parseInt(dataObj[b].available, 10) / areaChartConfig.yAxisMaxTicks);
+                                var val;
+                                if (usageVal > availableVal) {
+                                    val = usageVal;
+                                }
+                                else {
+                                    val = availableVal;
+                                }
+                                var Calc = Math.ceil((val / Math.pow(10, ("" + val).length - 1))) * (areaChartConfig.yAxisMaxTicks) * Math.pow(10, ("" + val).length - 1);
+                                yDomainData.push({'yAxisVal': Calc});
+                            }
+
+                            //Y-Axis Domain
+                            yRange.domain([0, d3.max(yDomainData, function (d) {
+                                    return (d.yAxisVal);
+                                })]);
+
+                            var yTick = d3.max(yDomainData, function (d) {
+                                return d.yAxisVal;
+                            });
+
+                            yTick = yTick / areaChartConfig.yAxisMaxTicks;
+                            for (var x = 0; x <= areaChartConfig.yAxisMaxTicks; x++) {
+                                yAxisData.push(yTick * x);
+                            }
+                            var formatData = function (d) {
+                                if (d >= areaChartConfig.amountMDivision) {
+                                    return d / areaChartConfig.amountMDivision + areaChartConfig.amountMText;
+                                } else if (d >= areaChartConfig.amountKDivision) {
+                                    return d / areaChartConfig.amountKDivision + areaChartConfig.amountKText;
+                                } else {
+                                    return d;
+                                }
+                            };
+                            var xAxis = d3.svg.axis().scale(xRange).orient("bottom").tickFormat(d3.time.format('%b')).ticks(d3.time.months);
+                            var yAxis = d3.svg.axis().scale(yRange).orient("left").tickValues(yAxisData).ticks(areaChartConfig.yAxisMaxTicks).tickFormat(formatData);
+
+                            //Draw Line
+                            var line = d3.svg.line()
+                                    .x(function (d) {
+                                        return xRange(d.numericMonth);
+                                    })
+                                    .y(function (d) {
+                                        return yRange(d.available);
+                                    }).interpolate(areaChartConfig.lineCurveType);
+
+                            //Draw Area        
+                            var area = d3.svg.area()
+                                    .x(function (d) {
+                                        return xRange(d.numericMonth);
+                                    })
+                                    .y0(height)
+                                    .y1(function (d) {
+                                        return yRange(d.usage);
+                                    }).interpolate(areaChartConfig.lineCurveType);
+
+                            //Plot Chart
+                            var drawChart = d3.select("#areaChartContainer")
+                                    .append("svg")
+                                    .attr("id", attrs.id)
+                                    .data(dataObj)
+                                    .attr("width", width + margin.left + margin.right)
+                                    .attr("height", parseInt(height, 10) + parseInt(margin.top, 10) + parseInt(margin.bottom, 10))
+                                    .append("g")
+                                    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
+
+                            //Apply gradients 
+                            if (!oldIE) {
+                                var svgDefs = drawChart.append("defs")
+                                        .append("linearGradient")
+                                        .attr("id", "areaGradient")
+                                        .attr('x1', '0%').attr('y1', '0%')
+                                        .attr('x2', '0%').attr('y2', '100%');
+
+                                //Fill gradient      
+                                svgDefs.append('stop')
+                                        .attr('stop-color', startColor)
+                                        .attr("offset", "0%")
+                                        .attr("stop-opacity", "1");
+                                svgDefs.append('stop')
+                                        .attr('stop-color', stopColor)
+                                        .attr("offset", "100%")
+                                        .attr("stop-opacity", "1");
+                            }
+
+                            //Draw X Axis        
+                            drawChart.append("g")
+                                    .attr("class", "x axis")
+                                    .attr("transform", "translate(0," + height + ")")
+                                    .call(xAxis).selectAll("text")
+                                    .attr("dy", "1.2em");
+
+
+                            if (isSingleMonth) {
+                                drawChart.selectAll('.x.axis').selectAll('.tick').selectAll('text')[1][0].textContent = singleMonthName;
+                            }
+
+                            //Plot Area
+                            var areaPath = drawChart.append("path")
+                                    .datum(dataObj)
+                                    .attr("class", "area")
+                                    .attr("d", area).style("fill", "url(#areaGradient)").append("title").text(function () {
+                                return scope.legendLabel[0].series;
+                            });
+
+                            var newDataObj = dataObj;
+                            if (isSingleMonth) {
+                                newDataObj = dataObj.slice(0, 1);
+                            }
+
+                            //Draw Data Points for Area Chart
+                            var circle = drawChart.selectAll(".dot")
+                                    .data(newDataObj)
+                                    .enter().append("circle")
+                                    .attr("class", "dot")
+                                    .attr("transform", "translate(" + (isSingleMonth === true) * width / 2 + ",0)")
+                                    .style("fill", function (d) {
+                                        if (d.usage > d.available) {
+                                            return scope.overageLegend;
+                                        }
+                                        else {
+                                            return scope.areaLegendColor;
+                                        }
+                                    })
+                                    .attr("r", areaChartConfig.circleRadius)
+                                    .attr("cx", function (d) {
+                                        return xRange(d.numericMonth);
+                                    })
+                                    .attr("cy", function (d) {
+                                        return yRange(d.usage);
+                                    }).on("mouseover", function (d) {
+                                var offsetX = Math.ceil(d3.select(this).attr("cx"));
+                                show_tooltip_grid_line(d3.select(this).attr("cx"), "circle", "cx");
+                                var offsetY = Math.round(d3.select(this).attr("cy"));
+                                d3.select('svg#' + attrs.id).style("fill-opacity", areaChartConfig.opacityOnHover);
+                                mouseOver(d, offsetX - 3, offsetY - 3);
+                            }).on("mouseout", function () {
+                                hide_tooltip_grid_line(d3.select(this).attr("cx"), "circle", "cx");
+                                d3.select('svg#' + attrs.id).style("fill-opacity", "1");
+                                scope.tooltipFlag = false;
+                                scope.$apply();
+                            });
+                            circle.append('desc').append('title').text(function (d) {
+                                return(addTitle(d));
+                            });
+
+                            //Draw Line Chart
+                            drawChart.append("path")
+                                    .attr("class", "line")
+                                    .style("stroke", lineColor)
+                                    //.style("stroke-dasharray", (areaChartConfig.lineStroke, areaChartConfig.lineStroke))
+                                    .attr("d", line(dataObj)).append("title").text(function () {
+                                return scope.legendLabel[1].series;
+                            });
+
+                            //Draw data points for Line Chart
+                            if (!oldIE) {
+                                var squaredot = drawChart.selectAll(".square-dot")
+                                        .data(newDataObj).enter().append("rect")
+                                        .attr("transform", "translate(" + (isSingleMonth === true) * width / 2 + ",0)")
+                                        .style("fill", scope.lineLegendColor)
+                                        .attr("class", "square-dot")
+                                        .attr("x", function (d) {
+                                            var tmp = xRange(d.numericMonth);
+                                            tmp = tmp - 2.5;
+                                            return tmp;
+                                        })
+                                        .attr("y", function (d) {
+                                            var tmp = yRange(d.available);
+                                            tmp = tmp - 2.5;
+                                            return tmp;
+                                        })
+                                        .attr("width", "5px")
+                                        .attr("height", "5px")
+                                        .on("mouseover", function (d) {
+                                            var offsetX = Math.ceil(d3.select(this).attr("x"));
+                                            show_tooltip_grid_line(d3.select(this).attr("x"), "rect", "x");
+                                            var offsetY = Math.round(d3.select(this).attr("y"));
+                                            d3.select('svg#' + attrs.id).style("fill-opacity", areaChartConfig.opacityOnHover);
+                                            mouseOver(d, offsetX, offsetY);
+                                        }).on("mouseout", function () {
+                                    hide_tooltip_grid_line(d3.select(this).attr("x"), "rect", "x");
+                                    d3.select('svg#' + attrs.id).style("fill-opacity", "1");
+                                    scope.tooltipFlag = false;
+                                    scope.$apply();
+                                });
+                                squaredot.append('desc').append('title').text(function (d) {
+                                    return(addTitle(d));
+                                });
+                            }
+                            else {
+                                areaPath.style("fill", startColor);
+                                var squareDot = drawChart.selectAll(".square-dot")
+                                        .data(newDataObj).enter().append("circle")
+                                        .attr("class", "square-dot")
+                                        .attr("transform", "translate(" + (isSingleMonth === true) * width / 2 + ",0)")
+                                        .style("fill", scope.areaLegendColor)
+                                        .attr("r", areaChartConfig.circleRadius)
+                                        .attr("cx", function (d) {
+                                            return xRange(d.numericMonth);
+                                        })
+                                        .attr("cy", function (d) {
+                                            return yRange(d.available);
+                                        }).on("mouseover", function (d) {
+                                    var offsetX = Math.ceil(d3.select(this).attr("cx"));
+                                    var offsetY = Math.round(d3.select(this).attr("cy"));
+                                    show_tooltip_grid_line(d3.select(this).attr("cx"), "circle", "cx");
+                                    d3.select('svg#' + attrs.id).style("fill-opacity", areaChartConfig.opacityOnHover);
+                                    mouseOver(d, offsetX, offsetY);
+                                }).on("mouseout", function () {
+                                    hide_tooltip_grid_line(d3.select(this).attr("cx"), "circle", "cx");
+                                    d3.select('svg#' + attrs.id).style("fill-opacity", "1");
+                                    scope.tooltipFlag = false;
+                                    scope.$apply();
+                                });
+                                squareDot.append('desc').append('title').text(function (d) {
+                                    return(addTitle(d));
+                                });
+                            }
+
+                            //Draw Y Axis
+                            var yAxisNodes = drawChart.append("g")
+                                    .attr("class", "y axis").attr("id", "yAxisId")
+                                    .call(yAxis);
+
+                            yAxisNodes.selectAll("text")
+                                    .attr("id", function (d, i) {
+                                        return ("yAxisText" + i);
+                                    });
+
+                            //Append Year Label 
+                            yAxisNodes.append("text")
+                                    .attr("transform", "rotate(0)")
+                                    .attr("y", areaChartConfig.yearLabelPos[1])
+                                    .attr("x", areaChartConfig.yearLabelPos[0]).attr("class", "yearLabel")
+                                    .text(yearLabel);
+                            //Remove minimum value label form Y Axis
+                            drawChart.select("#yAxisText0").remove();
+
+                            // Draw the x Grid lines
+                            drawChart.append("g")
+                                    .attr("class", "grid")
+                                    .attr("id", "xGrid")
+                                    .attr("transform", "translate(" + (isSingleMonth === true) * width / 2 + ",0)")
+                                    .call(make_x_axis()
+                                            .tickSize(-height, 0)
+                                            .tickFormat(""));
+
+                            // function for the x grid lines
+                            function make_x_axis() {
+                                return d3.svg.axis()
+                                        .scale(xRange)
+                                        .orient("top")
+                                        .tickFormat(d3.time.format('%b')).ticks(d3.time.months);
+                            }
+
+                            //drawChart.select("#xGrid").selectAll("line").style("stroke", areaChartConfig.gridLineColor);
+                            drawChart.select("#xGrid").selectAll("line").style("stroke", "none");
+                            drawChart.select("#xGrid").selectAll("line")
+                                    .attr("id", function (d, i) {
+                                        return ("xAxisLine" + i);
+                                    });
+
+                            //Add title for NVDA screen reader
+                            function addTitle(d) {
+                                return (tooltipFormat(d.numericMonth) + "Used" + d.usage + d.usageDataType + "Available" + d.available + d.availableDataType);
+                            }
+
+                            //Show Gridline on Mouse Hover        
+                            function show_tooltip_grid_line(offsetX, shape, attr) {
+                                try {
+                                    for (var i = 0; i < xAxisticks; i++) {
+                                        var circle = drawChart.selectAll(shape);
+                                        if (circle[0][i].getAttribute(attr) === offsetX) {
+                                            drawChart.select("#xAxisLine" + i).style("stroke", areaChartConfig.gridLineColor);
+                                        }
+                                    }
+                                } catch (e) {
+                                }
+                            }
+
+                            //Hide Gridline on Mouse Hover  
+                            function hide_tooltip_grid_line(offsetX, shape, attr) {
+                                try {
+                                    for (var i = 0; i < xAxisticks; i++) {
+                                        var circle = drawChart.selectAll(shape);
+                                        if (circle[0][i].getAttribute(attr) === offsetX) {
+                                            drawChart.select("#xAxisLine" + i).style("stroke", "transparent");
+                                        }
+                                    }
+                                } catch (e) {
+                                }
+                            }
+
+                            //Mouse Hover
+                            function mouseOver(d, offsetX, offsetY) {
+                                scope.underageFlag = false;
+                                scope.overageFlag = false;
+                                if (d.usage > d.available) {
+                                    scope.overageFlag = true;
+                                }
+                                if (d.usage < d.available) {
+                                    scope.underageFlag = true;
+                                }
+                                scope.dataPoint = {"xData": tooltipFormat(d.numericMonth).replace('-', ' '), "dataUsed": d.usage, "dataAvailable": d.available, "overage": d.overage, "usageDataType": d.usageDataType, "availableDataType": d.availableDataType, "underage": d.underage};
+                                scope.$apply();
+                                $timeout(function () {
+                                    offsetY = offsetY - areaChartConfig.tooltipTopMargin;
+                                    var tooltipEl = element.children().eq(2);
+                                    var tooltipWidth = tooltipEl[0].offsetWidth;
+                                    if (isSingleMonth) {
+                                        offsetX = offsetX - (tooltipWidth / 2) + areaChartConfig.tooltipLeftMargin + (width / 2);
+                                    } else {
+                                        offsetX = offsetX - (tooltipWidth / 2) + areaChartConfig.tooltipLeftMargin;
+                                    }
+                                    scope.tooltipStyle = {"left": offsetX + "px", "top": offsetY + "px"};
+                                    scope.tooltipFlag = true;
+                                },0);
+                            }
+                            scope.refreshChart = false;
+                        });
+                    }
+                };
+            }])
+        .filter('filterInput', function () {
+            return function (input) {
+                return input.replace(/ +/g, "").toLowerCase();
+            };
+        });
+angular.module('att.charts.barchartD3', ['att.charts.utilities'])
+        
+        .constant("BarChartD3Config",
+                {
+                    "barChartColor": "#0081C2",
+                    "gridLineColor": "#808080",
+                                       "yaxisGridLineColor": "#000000",
+                    "margin": {
+                            top  : 40, 
+                            right: 20,
+                            bottom: 30,
+                            left: 40
+                    },
+                    "attributes": {
+                        "userName": "name",
+                        "phoneNumber": "phoneNumber",
+                        "charges": "charges"
+                    },
+                    "yAxisMaxTicks": 4,
+                    "chartHeight": 160,
+                    "amountFormat" : "$0,000",
+                    "amountKDivision" : 1000,
+                    "amountKText" : "K",
+                    "amountMDivision" : 1000000,    
+                    "amountMText" : "M",
+                    "xAxistickSize":0,
+                    "tooltipTopMargin":69,
+                    "tooltipLeftMargin":59,
+                    "xAxisTextTopMargin":15,
+                    "xAxisTextLeftMargin":7,
+                    "barChartSize":25,
+                    "barHoverOpacity":0.2
+                }) 
+                
+        .directive('attBarChart', ['BarChartD3Config','$extendObj', function(BarChartD3Config,$extendObj) {
+                return {
+                    restrict: 'A',
+                    scope: {
+                        chartData: '=',
+                        chartConfig: '=',
+                        refreshChart: "="
+                    },                   
+                    templateUrl: "template/barchartD3/attBarChartD3.html",
+                    replace: true,
+                    link: function(scope, element, attrs, ctrl) {
+                                             
+                        scope.$watch('refreshChart', function() {
+                        if (angular.isDefined(scope.chartConfig)) {
+                                BarChartD3Config = $extendObj.extendDeep(BarChartD3Config, scope.chartConfig);
+                        }
+
+                        var width = parseInt(attrs.chartWidth, 10),
+                            chartColor = BarChartD3Config.barChartColor,
+                            height = BarChartD3Config.chartHeight,
+                            userName = BarChartD3Config.attributes.userName,
+                            charges = BarChartD3Config.attributes.charges,
+                            phoneNumber = BarChartD3Config.attributes.phoneNumber,
+                            formatCharges = d3.format(BarChartD3Config.amountFormat),
+                            isSingleDataObj = false, padding = 20;
+                        var barChartData, yDomainData = [],yAxisData = [];
+                        scope.tooltipFlag = false;
+                        var compare = function compare(a, b) {
+                            if (parseInt(a[charges], 10) > parseInt(b[charges], 10)) {
+                                return -1;
+                            }
+                            if (parseInt(a[charges], 10) < parseInt(b[charges], 10)) {
+                                return 1;
+                            }
+                            return 0;
+                        };
+
+
+                            d3.select("svg#" + attrs.id).remove();
+                            d3.selectAll("svg#" + attrs.id + " > *").remove();
+                            d3.selectAll("div#barChartContainer" + " > div").remove();
+
+                            barChartData = scope.chartData.sort(compare);
+                            barChartData = barChartData.slice(0,BarChartD3Config.barChartSize);
+                            if (barChartData.length === 1) {
+                                isSingleDataObj = true;
+                            }
+                            var x = d3.scale.ordinal().rangeBands([0, width]);
+
+                            var y = d3.scale.linear()
+                                    .range([height, 0]);
+
+                            x.domain(barChartData.map(function(d, i) {
+                                return i + 1;
+                            }));
+                           
+                            for(var b=0; b < barChartData.length; b++){
+                                var val = Math.round(parseInt(barChartData[b].charges, 10)/BarChartD3Config.yAxisMaxTicks); 
+                                var Calc =  Math.ceil((val / Math.pow(10, ("" + val).length - 1))) * (BarChartD3Config.yAxisMaxTicks) * Math.pow(10, ("" + val).length - 1);
+                                yDomainData.push({'yAxisVal':Calc});
+                            }
+                            
+                            //Y-Axis Domain
+                            y.domain([0, d3.max(yDomainData, function(d) {
+                                return (d.yAxisVal);
+                            })]);
+                            
+                            var yTick = d3.max(yDomainData, function(d) {return d.yAxisVal;});
+                            
+                            yTick = yTick/BarChartD3Config.yAxisMaxTicks;
+                            for(var z = 0; z <= BarChartD3Config.yAxisMaxTicks; z++){
+                                yAxisData.push(yTick * z);
+                            }
+                            var formatMoney = function(d) {
+                                if (d >= BarChartD3Config.amountMDivision) {
+                                    return "$" + d / BarChartD3Config.amountMDivision + BarChartD3Config.amountMText;
+                                }  else if (d >= BarChartD3Config.amountKDivision) {
+                                    return "$" + d / BarChartD3Config.amountKDivision + BarChartD3Config.amountKText;
+                                } else {
+                                    return "$" + d;
+                                }
+                            };
+
+                            var xAxis = d3.svg.axis()
+                                    .scale(x)
+                                    .orient("bottom")
+                                    .tickSize(BarChartD3Config.xAxistickSize);
+
+                            var yAxis = d3.svg.axis().scale(y).orient("left").tickValues(yAxisData).ticks(BarChartD3Config.yAxisMaxTicks).tickFormat(formatMoney);
+
+                            var svg = d3.select("#barChartContainer")
+                                    .append("svg")
+                                    .attr("id", attrs.id)
+                                    .attr("width", width + BarChartD3Config.margin.left + BarChartD3Config.margin.right)
+                                    .attr("height", height + BarChartD3Config.margin.top + BarChartD3Config.margin.bottom)
+                                    .append("g")
+                                    .attr("transform", "translate(" + BarChartD3Config.margin.left + "," + BarChartD3Config.margin.top + ")");
+                            
+                            svg.append("g")
+                                    .attr("class", "x axis")
+                                    .attr("transform", "translate(" + -Math.ceil((x(2) - x(1)) / 2 - BarChartD3Config.xAxisTextTopMargin) + "," + (height + BarChartD3Config.xAxisTextLeftMargin) + ")")
+                                    .call(xAxis);
+                            
+                            var formatPhNumber = function(phoneNum) {
+                                if (phoneNum.indexOf("-") === -1) {
+                                    return phoneNum.substr(0, 3) + '-' + phoneNum.substr(3, 3) + '-' + phoneNum.substr(6);
+                                } else {
+                                    return phoneNum;
+                                }
+                            };
+                            
+                            var rectBarGroup = svg.append("g")
+                                    .attr("class", "group").attr("id", function (d, i) {
+                                return ("barGroup" + i);
+                            }).attr("transform", "translate(" + (isSingleDataObj === true? ((width / 2) + 11):10) + ",0)");
+                            
+                            var rectBars = rectBarGroup.selectAll(".bar")
+                                    .data(barChartData)
+                                    .enter().append("rect")
+                                    .attr("style", "fill:" + chartColor)
+                                    .attr("class", "bar")
+                                    .attr("x", function(d, i) {
+                                        return Math.round(x(i + 1));
+                                    })
+                                    .attr("width", 10)
+                                    .attr("y", function(d) {
+                                        return y(d[charges]);
+                                    })
+                                    .attr("height", function(d) {
+                                         return (height - y(d[charges]));
+                                    })
+                                    .on("mouseover", function(d) {
+                                        var offsetX = Math.round(d3.select(this).attr("x"));
+                                        show_tooltip_grid_line(offsetX);
+                                        var offsetY = Math.round(d3.select(this).attr("y"));
+                                        svg.select(".grid").selectAll("line").style("stroke", "transparent");
+                                        svg.selectAll(".bar").style("fill-opacity",BarChartD3Config.barHoverOpacity);
+                                        d3.select(this).style("fill-opacity","1");
+                                        mouseOver(d, offsetX, offsetY);
+                                    })
+                                    .on("mouseout", function() {
+                                        var offsetX = Math.round(d3.select(this).attr("x"));
+                                        hide_tooltip_grid_line(offsetX);
+                                        scope.tooltipFlag = false;
+                                        svg.select(".grid").selectAll("line").style("stroke", BarChartD3Config.gridLineColor);
+                                        svg.selectAll(".bar").style("fill-opacity","1");
+                                        scope.$apply();
+                                    });
+                            rectBars.append('desc').append('title').text(function(d){ return (d[userName] + "-- Wireless Number" + formatPhNumber(d[phoneNumber]) + "Charges-" + d[charges]);});
+                            
+                            var yAxisNodes = svg.append("g")
+                                    .attr("class", "y axis")
+                                    .call(yAxis);
+
+                            yAxisNodes.selectAll("text")
+                                    .attr("id", function(d, i) {
+                                        return ("yAxisText" + i);
+                                    });
+
+                            yAxisNodes.selectAll("line")
+                                    .attr("id", function(d, i) {
+                                        return ("yAxisLine" + i);
+                                    });
+
+                            //Remove minimum value label form Y Axis
+                            d3.select("#yAxisText0").remove();
+                            d3.select("#yAxisLine0").remove();
+                            yAxisNodes.select("path").remove();
+
+                            // Draw the y Grid lines
+                            svg.append("g")
+                                .attr("class", "grid")
+                                .attr("transform", "translate(0,0)")
+                                .call(make_y_axis()
+                                        .tickSize(-width + x(2) - x(1), 0, 0)
+                                        .tickFormat(""));
+                            svg.select(".grid").selectAll("line").style("stroke", BarChartD3Config.gridLineColor);
+                            // function for the y grid lines
+                            function make_y_axis() {
+                                return d3.svg.axis()
+                                        .scale(y)
+                                        .orient("left")
+                                        .ticks(BarChartD3Config.yAxisMaxTicks).tickValues(yAxisData);
+                            }
+                            // Draw the x Grid lines
+                            svg.append("g")
+                                    .attr("class", "grid").attr("id", "xGrid")
+                                    .call(make_x_axis()
+                                        .tickSize(-height , 0)
+                                        .tickFormat("")).selectAll("line").attr("transform", "translate(" + -Math.ceil((x(2) - x(1)) / 2 - BarChartD3Config.xAxisTextTopMargin) + ",0)")
+                                    .attr("id", function (d, i) {
+                                        return ("xAxisLine" + i);
+                                    });
+
+                            
+                            // function for the x grid lines
+                            function make_x_axis() {
+                                return d3.svg.axis()
+                                        .scale(x)
+                                        .orient("top")
+                                        .ticks(BarChartD3Config.yAxisMaxTicks)
+                                        ;
+                            }
+                            svg.select("#xGrid").selectAll("line")
+                                    .attr("id", function(d, i) {
+                                        return ("xAxisLine" + i);
+                                    });
+                                    
+                            function show_tooltip_grid_line(offsetX){
+                                 for (var i = 0; i < barChartData.length; i++) {
+                                     if(Math.round(x(i+1))===offsetX){
+                                         svg.select("#xAxisLine"+i).style("stroke", BarChartD3Config.yaxisGridLineColor);
+                                     }
+                                }
+                            }
+                            
+                            function hide_tooltip_grid_line(offsetX){
+                                 for (var i = 0; i < barChartData.length; i++) {
+                                     if(Math.round(x(i+1))===offsetX){
+                                         svg.select("#xAxisLine"+i).style("stroke", "transparent");
+                                     }
+                                }
+                            }
+                            function mouseOver(d, offsetX, offsetY) {
+                                offsetY = offsetY - BarChartD3Config.tooltipTopMargin;
+                                if (isSingleDataObj) {
+                                    offsetX = offsetX - BarChartD3Config.tooltipLeftMargin + (width / 2);
+                                } else {
+                                    offsetX = offsetX - BarChartD3Config.tooltipLeftMargin;
+                                }
+                                scope.tooltipFlag = true;
+                                scope.tooltipStyle = {"left": offsetX + "px", "top": offsetY + "px"};
+                                scope.dataPoint = {"name": d[userName], "phoneNumber": formatPhNumber(d[phoneNumber]), "charges": formatCharges(d[charges])};
+                                scope.$apply();
+                            }
+                            scope.refreshChart = false;
+                        });
+                    }
+                };
+            }]);
+angular.module('att.charts.coschartD3', ['att.charts.utilities'])
+        .constant("CosChartD3Config",
+                {
+                    "chartcolor": {
+                        "paletteColors": ["#097cb5", "#FEFFF7"] //default color options for rendering chart baseColor and NeedleColor,
+
+                    },
+                    "defaultcenterlabel": "COS 1",
+                    "defaultcentercategory": "Real Time",
+                    "zoomLevel": "25",
+                    "doughnutratio": 20,
+                    "legendreqd": "false",
+                    "animduration": "300",
+                    "legendposition": "top",
+                    "centerTextValueDy": "0",
+                    "centerTextValueDx": "0",
+                    "centerTextPercentDx": "20",
+                    "centerTextPercentDy": "-10",
+                    "centerTextLabelDy": "20",
+                    "centerTextLabelDx": "0",
+                    "arcOverMargin": 5
+                })
+        .directive('attCosd3Chart', ['CosChartD3Config', '$timeout','$extendObj', function (CosChartD3Config, $timeout,$extendObj) {
+                return {
+                    restrict: 'A',
+                    scope: {
+                        chartConfig: '=',
+                        initVal: '='
+                    },
+                    templateUrl: 'template/coschartD3/attCosd3Chart.html',
+                    transclude: true,
+                    replace: true,
+                    controller: ['$scope', '$attrs', function ($scope, $attrs) {
+                            if (angular.isDefined($scope.chartConfig)) {
+                                CosChartD3Config = $extendObj.extendDeep(CosChartD3Config, $scope.chartConfig);
+                            }
+                            var legendColor = [];
+                            legendColor = CosChartD3Config.chartcolor.paletteColors;
+                            $scope.addLegendColor = function () {
+                                return {"color": legendColor[0]};
+                            };
+                            $scope.chartID = $attrs.id;
+                            if (!angular.isDefined($attrs.legendRequired)) {
+                                $scope.legendRequired = CosChartD3Config.legendreqd;
+                            } else {
+                                $scope.legendRequired = $attrs.legendRequired;
+                            }
+                            if (!angular.isDefined($attrs.legendPosition)) {
+                                $scope.legendPosition = CosChartD3Config.legendposition;
+                            } else {
+                                $scope.legendPosition = $attrs.legendPosition;
+                            }
+                        }],
+                    link: function (scope, element, attrs) {
+                        // var radius = Math.min(attrs.chartWidth, attrs.chartHeight) / 2,
+                        var color = d3.scale.ordinal().range(CosChartD3Config.chartcolor.paletteColors),
+                                zoom = parseInt(CosChartD3Config.zoomLevel, 0),data,
+                                margin = {// optionally set margins
+                                    top: zoom,
+                                    right: zoom,
+                                    bottom: zoom,
+                                    left: zoom
+                                },
+                        width = attrs.chartWidth,
+                                height = attrs.chartHeight,
+                                radius = Math.min(
+                                        width - (margin.left + margin.right),
+                                        height - (margin.top + margin.bottom)) / 2;
+                        scope.LegendLabel = CosChartD3Config.defaultcenterlabel;
+                        scope.LegendCategory = CosChartD3Config.defaultcentercategory;
+                        scope.$watch('initVal', function (value) {
+                            if(!angular.isDefined(scope.initVal)){
+                                return;
+                            }
+                            d3.select("svg#" + attrs.id).remove();
+                            d3.selectAll("svg#" + attrs.id + " > *").remove();
+                            var cosval = parseInt(scope.initVal.value, 10);
+                            scope.cosval = cosval + "%";
+                            if(cosval>100){
+                                data = [
+                                        {"name": "cos1", "value": 100},
+                                        {"name": "rest", "value": 0}
+                                        ];
+                                }else{
+                                        data = [
+                                        {"name": "cos1", "value": cosval},
+                                        {"name": "rest", "value": 100 - (parseInt(cosval, 10))}
+                                ];
+                            }
+                            var sliderpercent = parseInt(cosval, 10);
+                            if (angular.isDefined(sliderpercent)) {
+                                sliderpercent = 0;
+                            }
+                            element[0].querySelector('.cosd3Container').setAttribute('id', attrs.id);
+                            // build chart
+                            var svg = d3.select(".cosd3Container#" + attrs.id)
+                                    .attr("style", "height: " + attrs.chartHeight + "px;")
+                                    .append("svg")
+                                    .attr("id", attrs.id)
+                                    .attr("width", "100%")
+                                    .attr("height", "100%")
+                                    .attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
+                                    .attr('preserveAspectRatio', 'xMinYMin')
+                                    .append("g")
+                                    .attr("transform", "translate(" + Math.min(width, height) / 2 + "," + Math.min(width, height) / 2 + ")");
+                            // set radius
+                            var arc = d3.svg.arc()
+                                    .innerRadius(radius - CosChartD3Config.doughnutratio)
+                                    .outerRadius(radius);
+                            // set hovered radius
+                            var arcOver = d3.svg.arc()
+                                    .innerRadius(radius - CosChartD3Config.doughnutratio)
+                                    .outerRadius(radius + CosChartD3Config.arcOverMargin);
+
+                            // add center text element
+                            var centerTextValue = svg.append("text")
+                                    .attr("y", CosChartD3Config.centerTextValueDy)
+                                    .attr("x", CosChartD3Config.centerTextValueDx)
+                                    .attr("class", "coschartcenterValue");
+                            var centerTextPercent = svg.append("text")
+                                    .attr("x", CosChartD3Config.centerTextPercentDx)
+                                    .attr("y", CosChartD3Config.centerTextPercentDy)
+                                    .attr("class", "coschartcenterPercent");
+                            var centerTextLabel = svg.append("text")
+                                    .attr("y", CosChartD3Config.centerTextLabelDy)
+                                    .attr("x", CosChartD3Config.centerTextLabelDx)
+                                    .attr("class", "coschartcenterLabel");
+                            centerTextValue.text(cosval);
+                            centerTextPercent.text("%");
+                            centerTextLabel.text(CosChartD3Config.defaultcenterlabel + "(" + CosChartD3Config.defaultcentercategory + ")");
+
+                            var pie = d3.layout.pie()
+                                    .sort(null)
+                                    .startAngle(3.2 * Math.PI)
+                                    .endAngle(5.2 * Math.PI)
+                                    .value(function (d) {
+                                        return d.value;
+                                    });
+
+                            // set chart attributes and bind hover events
+                            var g = svg.selectAll(".arc")
+                                    .data(pie(data))
+                                    .enter()
+                                    .append("g")
+                                    .attr("class", "arc")
+                                    .attr("id", function (d, i) {
+                                        return "cosarc-" + i;
+                                    })
+                                    .style("cursor", "pointer");
+
+                            g.append("path")
+                                    .style("fill", function (d) {
+                                        return color(d.data.name);
+                                    })
+                                    .attr("id", function (d, i) {
+                                        return "cospath-" + i;
+                                    })
+                                    .on("mouseover", function (d) {
+                                        d3.select(this).transition()
+                                                .duration(CosChartD3Config.animduration)
+                                                .attr("d", arcOver);
+                                    })
+                                    .on("mouseout", function (d) {
+                                        d3.select(this).transition()
+                                                .duration(CosChartD3Config.animduration)
+                                                .attr("d", arc);
+                                    })
+                                    .transition()
+                                    .ease("exp")
+                                    .duration(0)
+                                    .attrTween("d", tweenPie);
+
+                            // animate function
+                            function tweenPie(b) {
+                                var i = d3.interpolate({
+                                    startAngle: 2.1 * Math.PI,
+                                    endAngle: 2.1 * Math.PI
+                                }, b);
+                                return function (t) {
+                                    return arc(i(t));
+                                };
+                            }
+                            if(cosval>0 && cosval<100){
+                                d3.select(".cosd3Container path#cospath-1").style('stroke', 'black');
+                            }
+                            
+
+
+                        });
+                    }
+                };
+            }]);
+angular.module('att.charts.coschartwithbarD3', ['att.charts.utilities'])
+.constant("CosChartWithBarD3Config",
+        {
+            "chartcolor": {
+                "paletteColors": ["#0574ac", "#44c8f5", "#4ca90c", "#da0081", "#ff9900", "#81017e"], //["#097cb5", "#FEFFF7"], //default color options for rendering chart baseColor and NeedleColor,
+                "zeroColor": "#ffffff",
+                "borderColor": "#666666"
+            },
+            "zoomLevel": "25",
+            "doughnutratio": 20,
+            "barreqd": "true",
+            "barHeight": 50,
+            "barWidth": 150,
+            "barCornerRadius": 9,
+            //"barTextValueDy": "250",
+            //"barTextValueDx": "0",
+            //"barTextPercentDx": "20",
+            //"barTextPercentDy": "-250",
+            //"barTextLabelDy": "60",
+            //"barTextLabelDx": "-80",
+            //"defaultbarlabel": "CoS 2V/CoS 2/CoS 3/CoS 4/CoS 5",
+            "animduration": "300",   
+            "centerText": {
+                'defaultCenterLabel': 'COS 1',
+                'defaultCenterCategory': 'Real Time',
+                'textValueDy': '0',
+                'textValueDx': '0',
+                'textPercentDx': '20',
+                'textPercentDy': '-10',
+                'textLabelDx': '0',
+                'textLabelDy': '20',
+                'color': '#666666',
+                'size': '36px',
+                'font': 'omnes_att_light'
+            },
+            "centerTextValueDy": "0",
+            "centerTextValueDx": "0",
+            "centerTextPercentDx": "20",
+            "centerTextPercentDy": "-10",
+            "centerTextLabelDy": "20",
+            "centerTextLabelDx": "0",
+            "arcOverMargin": 5
+        })
+.directive('attCosBarD3Chart', ['CosChartWithBarD3Config', '$timeout','$extendObj', function (CosChartWithBarD3Config, $timeout,$extendObj) {return {
+            restrict: 'A',
+            scope: {
+                chartConfig: '=',
+                chartData: '=',
+                totalCos: '=',
+                remainingCos: '=',
+                mouseOver: '=?'
+            },
+            templateUrl: 'template/coschartwithbarD3/attCosBarD3Chart.html',
+            transclude: true,
+            replace: true,
+            controller: ['$scope', '$attrs', function ($scope, $attrs) {
+                if (angular.isDefined($scope.chartConfig)) {
+                    CosChartWithBarD3Config = $extendObj.extendDeep(CosChartWithBarD3Config, $scope.chartConfig);
+                }
+
+                $scope.chartID = $attrs.id;
+                if (!angular.isDefined($attrs.barRequired)) {
+                    $scope.barRequired = CosChartWithBarD3Config.barreqd;
+                } else {
+                    $scope.barRequired = $attrs.barRequired;
+                }
+
+                }],
+            link: function (scope, element, attrs) {
+                /*
+                    x: x-coordinate
+                    y: y-coordinate
+                    w: width
+                    h: height
+                    r: corner radius
+                    tl: top_left rounded?
+                    tr: top_right rounded?
+                    bl: bottom_left rounded?
+                    br: bottom_right rounded?
+                 */
+                function rounded_rect(x, y, w, h, r, tl, tr, bl, br) {
+                    var retval;
+                    retval  = "M" + (x + r) + "," + y;
+                    retval += "h" + (w - 2*r);
+                    if (tr) { retval += "a" + r + "," + r + " 0 0 1 " + r + "," + r; }
+                    else { retval += "h" + r; retval += "v" + r; }
+                    retval += "v" + (h - 2*r);
+                    if (br) { retval += "a" + r + "," + r + " 0 0 1 " + -r + "," + r; }
+                    else { retval += "v" + r; retval += "h" + -r; }
+                    retval += "h" + (2*r - w);
+                    if (bl) { retval += "a" + r + "," + r + " 0 0 1 " + -r + "," + -r; }
+                    else { retval += "h" + -r; retval += "v" + -r; }
+                    retval += "v" + (2*r - h);
+                    if (tl) { retval += "a" + r + "," + r + " 0 0 1 " + r + "," + -r; }
+                    else { retval += "v" + -r; retval += "h" + r; }
+                    retval += "z";
+                    return retval;
+                }
+
+                var radScale = d3.scale.linear().domain([0, 100]).range([0, 2 * Math.PI]);
+
+                 
+                var zoom = parseInt(CosChartWithBarD3Config.zoomLevel, 0),data,
+                    margin = {// optionally set margins
+                        top: zoom,
+                        right: zoom,
+                        bottom: zoom,
+                        left: zoom
+                    },
+                    width = attrs.chartWidth,
+                    height = attrs.chartHeight,
+                    radius = Math.min(
+                            width - (margin.left + margin.right),
+                            height - (margin.top + margin.bottom)) / 2;
+
+
+                scope.$watchCollection('chartData', function (value) {
+                    var j = 0; // index for for-loops
+
+                    if(!angular.isDefined(scope.chartData) || scope.chartData.length < 1){
+                        return;
+                    }
+
+                    d3.select("svg#" + attrs.id).remove();
+                    d3.selectAll("svg#" + attrs.id + " > *").remove();
+
+                    // SnickrBar
+                    d3.select("svg#" + scope.snickrbarId).remove();
+                    d3.selectAll("svg#" + scope.snickrbarId + " > *").remove();
+
+                    var cosval = scope.chartData[0];
+                    var remainingCosVal = 0, restCosVal = 0;
+
+                    for(j = 1; j < scope.chartData.length; j++)
+                    {
+                        remainingCosVal += parseInt(scope.chartData[j], 10); //parseInt allows strings to be passed in
+                    }
+                    restCosVal = 100 - cosval - remainingCosVal;
+                    scope.totalCos = cosval + remainingCosVal;
+                    scope.remainingCos = remainingCosVal;
+
+                    var data = angular.copy(scope.chartData);
+                    if (angular.isDefined(restCosVal)) {
+                        data.push(restCosVal);
+                    }
+
+                    element[0].querySelector('.cosd3Container').setAttribute('id', attrs.id);
+                    // build chart
+                    var svg = d3.select(".cosd3Container#" + attrs.id)
+                            .attr("style", "height: " + attrs.chartHeight + "px;")
+                            .append("svg")
+                            .attr("id", attrs.id)
+                            .attr("width", "100%")
+                            .attr("height", "100%")
+                            .attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
+                            .attr('preserveAspectRatio', 'xMinYMin')
+                            .append("g")
+                            .attr("transform", "translate(" + Math.min(width, height) / 2 + "," + Math.min(width, height) / 2 + ")");
+
+                    scope.snickrbarId = attrs.id + 'snickrbar';
+                    var snickrbar = d3.select(".snickrBar")
+                        .attr('style', 'margin-left:' + Math.floor(CosChartWithBarD3Config.barWidth/3) + ';')
+                        .style({'background-color': CosChartWithBarD3Config.chartcolor.zeroColor, 'width': CosChartWithBarD3Config.barWidth + 'px', 'border': '1px solid #777', 'border-radius': '10px'})
+                        .append("svg")
+                        .attr("id", scope.snickrbarId)
+                        .attr("width", CosChartWithBarD3Config.barWidth + "px")
+                        .attr("height", CosChartWithBarD3Config.barHeight + "px")
+                        .append("g");
+
+                    // set radius
+                    var arc = d3.svg.arc()
+                            .innerRadius(radius - CosChartWithBarD3Config.doughnutratio)
+                            .outerRadius(radius);
+
+                    // set hovered radius
+                    var arcOver = d3.svg.arc()
+                            .innerRadius(radius - CosChartWithBarD3Config.doughnutratio)
+                            .outerRadius(radius + CosChartWithBarD3Config.arcOverMargin);
+
+                    // add center text element
+                    var centerTextValue = svg.append("text")
+                            .attr("y", CosChartWithBarD3Config.centerText.textValueDy)
+                            .attr("x", CosChartWithBarD3Config.centerText.textValueDx)
+                            .attr("class", "coschartcenterValue");
+                    var centerTextPercent = svg.append("text")
+                            .attr("x", CosChartWithBarD3Config.centerText.textPercentDx)
+                            .attr("y", CosChartWithBarD3Config.centerText.textPercentDy)
+                            .attr("class", "coschartcenterPercent");
+                    var centerTextLabel = svg.append("text")
+                            .attr("y", CosChartWithBarD3Config.centerText.textLabelDy)
+                            .attr("x", CosChartWithBarD3Config.centerText.textLabelDx)
+                            .attr("class", "coschartcenterLabel");
+                    centerTextValue.text(cosval);
+                    centerTextPercent.text("%");
+                    centerTextLabel.text(CosChartWithBarD3Config.centerText.defaultCenterLabel + "(" + CosChartWithBarD3Config.centerText.defaultCenterCategory + ")");
+
+                    var scale = function(d) {
+                        if (d <= 0) {
+                            return 0;
+                        } else {
+                            var r = (d * CosChartWithBarD3Config.barWidth) / 100;
+                            if (isNaN(r)) { r = 0; }
+                            else if (!isFinite(r)) { r = CosChartWithBarD3Config.barWidth; }
+
+                            return r;
+                        }
+                    };
+
+                    // Only executed when totalCos is 0
+                    if (cosval <= 0) {
+                        arc.startAngle(0).endAngle(2 * Math.PI); //just radians
+                        svg.append("path")
+                                .attr("d", arc)
+                                .attr("fill", CosChartWithBarD3Config.chartcolor.zeroColor)
+                                .style("stroke", CosChartWithBarD3Config.chartcolor.borderColor)
+                                .style("stroke-width", 1);
+                    } else {
+
+                        // JVM: This code is temp for just snicker's bar release
+                        var temp = 100-data[0];
+                        var newData = [];
+                        newData.push({'value':data[0]});
+                        newData.push({'value':temp});
+
+                        /*for(j = 0; j < data.length; j++) {
+                            var obj = angular.extend({}, data[j]);
+                            obj.value = data[j];
+                            newData.push(obj);
+                        }*/
+
+
+                        //======================================================
+
+
+                        var pie = d3.layout.pie()
+                            .sort(null)
+                            .value(function (d,index) {
+                                var r = d.value;
+                                if (d.value <= 0) { r = 0; }
+                                return r;
+                            });
+
+                        // set chart attributes and bind hover events
+                        var g = svg.selectAll(".arc")
+                                .data(pie(newData))
+                                .enter()
+                                .append("g")
+                                .attr("class", "arc")
+                                .attr("id", function (d, i) {
+                                    return "cosarc-" + i;
+                                })
+                                .style("cursor", "pointer");
+
+                        g.append("path")
+                                .style("fill", function (d, i) {
+                                    if (i === CosChartWithBarD3Config.chartcolor.paletteColors.length || i === newData.length-1 || d.data.value === 0) {
+                                        return CosChartWithBarD3Config.chartcolor.zeroColor;
+                                    }
+
+                                    return CosChartWithBarD3Config.chartcolor.paletteColors[i];
+                                })
+                                .style("stroke", "white")
+                                .style("stroke-width", function(d,index) { if (cosval >= 100) { return 0; } else { return 1; } })
+                                .attr("id", function (d, i) {
+                                    return "cospath-" + i;
+                                })
+                                .on("mouseover", function (d, index) {
+                                    if (index < newData.length-1) {
+                                        d3.select(this).transition()
+                                            .duration(CosChartWithBarD3Config.animduration)
+                                            .attr("d", arcOver);
+                                    }
+                                })
+                                .on("mouseout", function (d, index) {
+                                    if (index < newData.length-1) {
+                                        d3.select(this).transition()
+                                                .duration(CosChartWithBarD3Config.animduration)
+                                                .attr("d", arc);
+                                    }
+                                })
+                                .transition()
+                                .ease("exp")
+                                .duration(0)
+                                .attrTween("d", tweenPie);
+                    } // end of else
+
+                    if (!CosChartWithBarD3Config.barreqd) { return; }
+                    var snickrData = [];
+                    var d = scope.chartData.slice(1, scope.chartData.length);
+                    for (j = 0; j < d.length; j++) {
+                        if (d[j] !== 0) {
+                            var obj = {};
+                            obj.data = d[j];
+                            obj.color = CosChartWithBarD3Config.chartcolor.paletteColors[j+1];
+                            snickrData.push(obj);    
+                        }
+                    }
+
+                    var prevWidth = 0;
+                    var nextX = function(d, i) {
+                        if (i === 0) {
+                            prevWidth = scale(d);
+                            return 0;
+                        } else {
+                            var p = prevWidth;
+                            prevWidth += scale(d);
+                            return p;
+                        }
+                    };
+
+                    var rect = snickrbar.selectAll("path")
+                        .data(snickrData)
+                        .enter()
+                        .append("path")
+                        .style("fill", function(d, i) { 
+                            if (i >= CosChartWithBarD3Config.chartcolor.paletteColors.length || d.data === 0) {
+                                return CosChartWithBarD3Config.chartcolor.zeroColor;
+                            }
+
+                            return d.color;
+                        })
+                        .attr("d", function(d, index) {
+                            if (index === 0) {
+                                // Left rounded rectangle
+                                return rounded_rect(nextX(d.data, index), 0, scale(d.data), CosChartWithBarD3Config.barHeight, CosChartWithBarD3Config.barCornerRadius, true, false, true, false);
+                            } else if (index === snickrData.length-1 && remainingCosVal >= 100) {
+                                // Right rounded rectangle
+                                return rounded_rect(nextX(d.data, index), 0, scale(d.data), CosChartWithBarD3Config.barHeight, CosChartWithBarD3Config.barCornerRadius, false, true, false, true);
+                            } else {
+                                console.log('normal rect at ' + index);
+                                return rounded_rect(nextX(d.data, index), 0, scale(d.data), CosChartWithBarD3Config.barHeight, 0, false, false, false, false); 
+                            }
+                        });
+
+                    if (remainingCosVal === 0) {
+                        snickrbar.attr("fill", CosChartWithBarD3Config.chartcolor.zeroColor);
+                    }
+
+                    // add bar text element
+                    /*var snickerText = d3.select('.snickrBar svg')
+                        .append("g")
+                        .style("fill", "black");
+
+                    var barTextValue = snickerText.append("text")
+                            .attr("y", CosChartWithBarD3Config.barTextValueDy)
+                            .attr("x", CosChartWithBarD3Config.barTextValueDx)
+                            .attr("class", "coschartbarcenterValue");
+                    var barTextPercent = snickerText.append("text")
+                            .attr("x", CosChartWithBarD3Config.barTextPercentDx)
+                            .attr("y", CosChartWithBarD3Config.centerTextPercentDy)
+                            .attr("class", "coschartbarcenterPercent");
+                    var barTextLabel = snickerText.append("text")
+                            .attr("y", CosChartWithBarD3Config.barTextLabelDy)
+                            .attr("x", CosChartWithBarD3Config.barTextLabelDx)
+                            .attr("class", "coschartbarcenterLabel");
+                    barTextValue.text(cosval);
+                    barTextPercent.text("%");
+                    barTextLabel.text(CosChartWithBarD3Config.defaultbarlabel);*/
+
+                    
+
+                    // animate function
+                    function tweenPie(b) {
+                        var i = d3.interpolate({
+                            startAngle: 2.1 * Math.PI,
+                            endAngle: 2.1 * Math.PI
+                        }, b);
+                        return function (t) {
+                            return arc(i(t));
+                        };
+                    }
+
+                    scope.$watch('mouseOver', function(val) {
+                        if (!angular.isDefined(scope.mouseOver)) { return; }
+                        var id = scope.mouseOver.split('-')[1];
+                        if (scope.mouseOver.split('-')[0] === 'true') {
+                            if (id === '0') {
+                                d3.select("#cospath-" + id).transition()
+                                    .duration(CosChartWithBarD3Config.animduration)
+                                    .attr("d", arcOver);
+                            } else {
+                                for (var i = 0; i < newData.length-1; i++) {
+                                    d3.select("#cospath-" + (i+1)).transition()
+                                        .duration(CosChartWithBarD3Config.animduration)
+                                        .attr("d", arcOver);
+                                }
+                            }
+                        } else {
+                            if (id === '0') {
+                                d3.select("#cospath-" + id).transition()
+                                    .duration(CosChartWithBarD3Config.animduration)
+                                    .attr("d", arc);
+                            } else {
+                                for (j = 0; j < newData.length-1; j++) {
+                                    d3.select("#cospath-" + (j+1)).transition()
+                                        .duration(CosChartWithBarD3Config.animduration)
+                                        .attr("d", arc);
+                                }
+                            }
+                        }
+                    });
+
+                });
+
+            }
+        };
+    }]);
+angular.module('att.charts.cosdeletionD3', ['att.charts.utilities'])
+        .constant("CosdeletionD3Config",
+                {
+                    "chartcolor": {
+                        "MaxBandwidthReached": "#d3d3d3",
+                        "ZeroBandwidthSelected": "#FEFFF7",
+                        "RemainingBandwidthColor": "#ffffff",
+                        "RemainingBandwidthStrokeColor": "#d3d3d3",
+                        "RemainingBandwidthStrokeWidth": 1.5,
+                        "UsedBandwidthColor": "#0574AC",
+                        "UsedBandwidthStrokeColor":"#efefef", //white
+                        "UsedBandwidthStrokeWidth":"1"
+                    },
+                    "defaultcenterlabel": "Kbps",
+                    "zoomLevel": "10",
+                    "doughnutratio": 21,
+                    "animduration": "300",
+                    "guageStartAngle":4,
+                    "guageEndAngle":8.56,
+                    "legendreqd": "false",
+                    "initduration": "1000",
+                    "legendposition": "top",
+                    "centerTextLabelDy": "20",
+                    "centerTextValueDy": "0",
+                    "centerTextValueDx": "-30",
+                    "centerTextLabelDx": "-10",
+                    "maxbandwidthTextDx": "25",
+                    "maxbandwidthTextDy": "70",
+                    "arcOverMargin": 5
+                })
+        .directive('attCosdeletiond3Chart', ['CosdeletionD3Config', '$timeout','$extendObj', function(CosdeletionD3Config, $timeout,$extendObj) {
+                return {
+                    restrict: 'A',
+                    scope: {
+                        maxValue: '=',
+                        chartData: '=',
+                        chartConfig: '=',
+                        resetChart: '=',
+                        removeArcs: '='
+                    },
+                    controller: ['$scope', '$attrs', function($scope, $attrs) {
+                        if (angular.isDefined($scope.chartConfig)) {
+                            CosdeletionD3Config = $extendObj.extendDeep(CosdeletionD3Config, $scope.chartConfig);
+                        }
+
+                        }],
+                    link: function(scope, element, attrs) {
+                        var zoom = parseInt(CosdeletionD3Config.zoomLevel, 0),
+                                margin = {// optionally set margins
+                                    top: zoom,
+                                    right: zoom,
+                                    bottom: zoom,
+                                    left: zoom
+                                },
+                        width = attrs.chartWidth,
+                                height = attrs.chartHeight,
+                                radius = Math.min(
+                                        width - (margin.left + margin.right),
+                                        height - (margin.top + margin.bottom)) / 2,arcPath;
+                        // set radius
+                        var arc = d3.svg.arc()
+                                .innerRadius(radius - CosdeletionD3Config.doughnutratio)
+                                .outerRadius(radius);
+                        var arcOver = d3.svg.arc()
+                                        .innerRadius(radius - CosdeletionD3Config.doughnutratio)
+                                        .outerRadius(radius + CosdeletionD3Config.arcOverMargin);
+                       
+                        // Browser onresize event
+                        window.onresize = function() {
+                            scope.$apply();
+                        };
+                        scope.$watch('resetChart', function(newValue, oldValue) {
+                            if(scope.resetChart === true){
+                                scope.resetChart = false;
+                                return;
+                            }
+                            return scope.render(newValue, oldValue);
+                        });
+                        scope.render = function(newValue, oldValue) {
+                            d3.select("svg#" + attrs.id).remove();
+                            d3.selectAll("svg#" + attrs.id + " > *").remove();
+                            if (!scope.chartData)
+                            {
+                                return;
+                            }
+                            var data=angular.copy(scope.chartData);
+                            data=data.reverse();
+                            var totalBandwidth=0,totalUsed=0,remainingBandwidth=0,dynamicColorRange=[],noCheckBoxSelected=true,selectedBandwidth=0,selectedElem=[];
+                            if (angular.isDefined(scope.maxValue)) {
+                                totalBandwidth = parseInt(scope.maxValue, 0);
+                            }
+                            for (var j = 0; j < data.length; j++) {
+                                totalUsed = (totalUsed + parseInt(data[j].value, 0));
+                                if(angular.equals(data[j].status, true)){
+                                    noCheckBoxSelected=false;
+                                    selectedBandwidth=selectedBandwidth+data[j].value;
+                                    
+                                    data[j].value=0;
+                                    dynamicColorRange.push(CosdeletionD3Config.chartcolor.MaxBandwidthReached);
+                                   
+                                }else{
+                                    selectedElem.push({index: data[j].id, value: data[j].value});
+                                    dynamicColorRange.push(CosdeletionD3Config.chartcolor.UsedBandwidthColor);
+                                }
+                            }
+                           if(scope.removeArcs){
+                                while(data.length > 0) {
+                                    data.pop();
+                                }
+                              dynamicColorRange=[];
+                              data.push({name: "totalUsed", value: totalUsed-selectedBandwidth,id:"totalUsed"});
+                              dynamicColorRange.push(CosdeletionD3Config.chartcolor.UsedBandwidthColor);
+                              scope.removeArcs=false;
+                           }
+                            if(totalUsed>0 && totalUsed<totalBandwidth){
+                                remainingBandwidth=totalBandwidth-totalUsed;
+                                if(!noCheckBoxSelected){
+                                    data.push({name: "selectedBandwidth", value: selectedBandwidth,id:"selectedBandwidth"});
+                                    dynamicColorRange.push(CosdeletionD3Config.chartcolor.MaxBandwidthReached);
+                                }
+                                data.push({name: "remaining", value: remainingBandwidth,id:"remaining"});
+                                dynamicColorRange.push(CosdeletionD3Config.chartcolor.RemainingBandwidthColor);
+                            }
+                            element[0].setAttribute('id', attrs.id);
+                            var svg = d3.select(element[0])
+                                    .attr("style", "height: " + attrs.chartHeight + "px;")
+                                    .append("svg")
+                                    .attr("id", attrs.id)
+                                    .attr("radius", radius)
+                                    .attr("width", attrs.chartWidth)
+                                    .attr("height", attrs.chartHeight)
+                                    .attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
+                                    .attr('preserveAspectRatio', 'xMinYMin')
+                                    .append("g")
+                                    .attr("transform", "translate(" + Math.min(width, height) / 2 + "," + Math.min(width, height) / 2 + ")");
+
+                            var centerTextValue = svg.append("text")
+                                    .attr("y", CosdeletionD3Config.centerTextValueDy)
+                                    .attr("x", CosdeletionD3Config.centerTextValueDx)
+                                    .attr("class", "cosdeletioncenterValue");
+                            var centerTextLabel = svg.append("text")
+                                    .attr("y", CosdeletionD3Config.centerTextLabelDy)
+                                    .attr("x", CosdeletionD3Config.centerTextLabelDx)
+                                    .attr("class", "cosdeletioncenterLabel");
+                            var maxbandwidthText = svg.append("text")
+                                    .attr("y", CosdeletionD3Config.maxbandwidthTextDy)
+                                    .attr("x", CosdeletionD3Config.maxbandwidthTextDx)
+                                    .attr("class", "cosdeletionmaxbandwidthText");
+                         
+                            var color = d3.scale.ordinal().range(dynamicColorRange);
+                            centerTextValue.text(totalUsed-selectedBandwidth);
+                            centerTextLabel.text(CosdeletionD3Config.defaultcenterlabel);
+                            maxbandwidthText.text(totalBandwidth + " " + CosdeletionD3Config.defaultcenterlabel);
+                            
+                            var pie = d3.layout.pie()
+                                    .sort(null)
+                                    .startAngle(CosdeletionD3Config.guageStartAngle)
+                                    .endAngle(CosdeletionD3Config.guageEndAngle)
+                                    .value(function(d) {
+                                        return d.value;
+                                    });
+                              
+                            var g = svg.selectAll(".arc")
+                                    .data(pie(data))
+                                    .enter()
+                                    .append("g")
+                                    .attr("class", "arc")
+                                    .attr("id", function(d, i) {
+                                        return "cosdeletionarc-" + d.data.id;
+                                    })
+                                    .style("cursor", "pointer");
+                            
+                            arcPath = g.append("path")
+                                        .style("fill", function(d) {
+                                            return color(d.data.name);
+                                        }).attr("id", function(d, i) {
+                                            return "cosdeletionpath-" + d.data.id;
+                                        })
+                                        .transition()
+                                        .ease("exp")
+                                        .duration(0)
+                                        .attrTween("d", tweenPie);
+                                
+                            arcPath = arcPath[0];
+                            for (var i = 0; i < arcPath.length; i++) {
+                                    var id = arcPath[i].id;
+                                    if (id !== 'cosdeletionpath-remaining' && id !== 'cosdeletionpath-selectedBandwidth') {
+                                        d3.select("path#" + id).transition().attr("d", arcOver);
+                                    }
+                                }
+                          
+                            if (remainingBandwidth > 0) {
+                                if(angular.isDefined(newValue) && angular.isDefined(oldValue)){
+                                    for (var k = 0; k < selectedElem.length; k++) {
+                                         var index =selectedElem[k].index;
+                                        d3.select("path#cosdeletionpath-" + index).style('stroke', CosdeletionD3Config.chartcolor.UsedBandwidthStrokeColor).style("stroke-width", CosdeletionD3Config.chartcolor.UsedBandwidthStrokeWidth);
+                                    }
+                                }
+                                d3.select("#" + attrs.id + " path#cosdeletionpath-remaining").style('stroke', CosdeletionD3Config.chartcolor.RemainingBandwidthStrokeColor).style("stroke-width", CosdeletionD3Config.chartcolor.RemainingBandwidthStrokeWidth);
+                            } 
+                        };
+                        
+                        function tweenPie(b) {
+                                var i = d3.interpolate({
+                                    startAngle: 2.1 * Math.PI,
+                                    endAngle: 2.1 * Math.PI
+                                }, b);
+                                return function(t) {
+                                    return arc(i(t));
+                                };
+                            }
+                    }
+                };
+            }]);
+angular.module('att.charts.cosmultichartD3', ['att.charts.utilities'])
+        .constant("CosMultiChartD3Config",
+                {
+                    "chartcolor": {
+                        "paletteColors": ["#44c6f7", "#4ba90b", "#d70e80", "#ff9900", "#81017e", "#cccccc"], //default color options for rendering chart baseColor and NeedleColor,
+                        "zeroTicketColor": ["#d3d3d3"]
+                    },
+                    "defaultcenterlabel": "CoS",
+                    "defaultcentercategory": "2V/2/3/4/5",
+                    "zoomLevel": "25",
+                    "doughnutratio": 20,
+                    "animduration": "300",
+                    "legendreqd": "false",
+                    "initduration": "1000",
+                    "legendposition": "top",
+                    "centerTextValueDy": "0",
+                    "centerTextValueDx": "0",
+                    "centerTextPercentDx": "22",
+                    "centerTextPercentDy": "-8",
+                    "centerTextLabelDy": "20",
+                    "centerTextLabelDx": "0",
+                    "arcOverMargin": 5
+                })
+        .directive('attCosmultid3Chart', ['CosMultiChartD3Config', '$timeout','$extendObj', function (CosMultiChartD3Config, $timeout,$extendObj) {
+                return {
+                    restrict: 'A',
+                    scope: {
+                        chartData: '=',
+                        chartConfig: '='
+                    },
+                    templateUrl: 'template/cosmultichartD3/attCosmultid3Chart.html',
+                    transclude: true,
+                    replace: true,
+                    controller: ['$scope', '$attrs', function ($scope, $attrs) {
+
+                            if (angular.isDefined($scope.chartConfig)) {
+                                CosMultiChartD3Config = $extendObj.extendDeep(CosMultiChartD3Config, $scope.chartConfig);
+                            }
+
+                            $scope.addLegendColor = function (id, item) {
+                                return {"color": CosMultiChartD3Config.chartcolor.paletteColors[id]};
+                            };
+
+                            $scope.chartID = $attrs.id;
+                            if (!angular.isDefined($attrs.legendRequired)) {
+                                $scope.legendRequired = CosMultiChartD3Config.legendreqd;
+                            } else {
+                                $scope.legendRequired = $attrs.legendRequired;
+                            }
+                            if (!angular.isDefined($attrs.legendPosition)) {
+                                $scope.legendPosition = CosMultiChartD3Config.legendposition;
+                            } else {
+                                $scope.legendPosition = $attrs.legendPosition;
+                            }
+                        }],
+                    link: function (scope, element, attrs) {
+                        var zoom = parseInt(CosMultiChartD3Config.zoomLevel, 0),
+                                pi = Math.PI,
+                                margin = {// optionally set margins
+                                    top: zoom,
+                                    right: zoom,
+                                    bottom: zoom,
+                                    left: zoom
+                                },
+                        width = attrs.chartWidth,
+                                height = attrs.chartHeight,
+                                radius = Math.min(
+                                        width - (margin.left + margin.right),
+                                        height - (margin.top + margin.bottom)) / 2;
+
+                        function renderChart() {
+                            var color = d3.scale.ordinal().range(CosMultiChartD3Config.chartcolor.paletteColors);
+                            d3.select("svg#" + attrs.id).remove();
+                            d3.selectAll("svg#" + attrs.id + " > *").remove();
+                            var totalCosVal = 0, remainingCosVal;
+                            for (var j = 0; j < scope.chartData.length; j++) {
+                                var chartObj = scope.chartData[j];
+                                totalCosVal = (totalCosVal + parseInt(chartObj.value, 10));
+                            }
+                            remainingCosVal = 100 - parseInt(totalCosVal, 10);
+                            var data = angular.copy(scope.chartData);
+                            if (angular.isDefined(remainingCosVal)) {
+                                data.push({name: "rest", value: remainingCosVal});
+                            }
+                            element[0].querySelector('.cosmultid3Container').setAttribute('id', attrs.id);
+                            // build chart
+                            var svg = d3.select(".cosmultid3Container#" + attrs.id)
+                                    .attr("style", "height: " + attrs.chartHeight + "px;")
+                                    .append("svg")
+                                    .attr("id", attrs.id)
+                                    .attr("width", "100%")
+                                    .attr("height", "100%")
+                                    .attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
+                                    .attr('preserveAspectRatio', 'xMinYMin')
+                                    .append("g")
+                                    .attr("transform", "translate(" + Math.min(width, height) / 2 + "," + Math.min(width, height) / 2 + ")");
+                            // set radius
+                            var arc = d3.svg.arc()
+                                    .innerRadius(radius - CosMultiChartD3Config.doughnutratio)
+                                    .outerRadius(radius);
+                            // set hovered radius
+                            var arcOver = d3.svg.arc()
+                                    .innerRadius(radius - CosMultiChartD3Config.doughnutratio)
+                                    .outerRadius(radius + CosMultiChartD3Config.arcOverMargin);
+                            // add center text element
+                            var centerTextValue = svg.append("text")
+                                    .attr("y", CosMultiChartD3Config.centerTextValueDy)
+                                    .attr("x", CosMultiChartD3Config.centerTextValueDx)
+                                    .attr("class", "cosmultichartcenterValue");
+                            var centerTextPercent = svg.append("text")
+                                    .attr("x", CosMultiChartD3Config.centerTextPercentDx)
+                                    .attr("y", CosMultiChartD3Config.centerTextPercentDy)
+                                    .attr("class", "cosmultichartcenterPercent");
+                            var centerTextLabel = svg.append("text")
+                                    .attr("y", CosMultiChartD3Config.centerTextLabelDy)
+                                    .attr("x", CosMultiChartD3Config.centerTextLabelDx)
+                                    .attr("class", "cosmultichartcenterLabel");
+                            centerTextValue.text(totalCosVal);
+                            centerTextPercent.text("%");
+                            centerTextLabel.text(CosMultiChartD3Config.defaultcenterlabel +"  " + CosMultiChartD3Config.defaultcentercategory);
+
+                            if (totalCosVal <= 0) {
+                                arc.startAngle(0).endAngle(2 * pi); //just radians
+                                svg.append("path")
+                                        .attr("d", arc)
+                                        .attr("fill", CosMultiChartD3Config.chartcolor.zeroTicketColor);
+                            } else {
+                                var pie = d3.layout.pie()
+                                        .sort(null)
+                                        .startAngle(3.2 * Math.PI)
+                                        .endAngle(5.2 * Math.PI)
+                                        .value(function (d) {
+                                            return d.value;
+                                        });
+
+                                var g = svg.selectAll(".arc")
+                                        .data(pie(data))
+                                        .enter()
+                                        .append("g")
+                                        .attr("class", "arc")
+                                        .attr("id", function (d, i) {
+                                            return "cosmultiarc-" + i;
+                                        })
+                                        .style("cursor", "pointer");
+
+                                g.append("path")
+                                        .style("fill", function (d) {
+                                            return color(d.data.name);
+                                        })
+                                        .attr("id", function (d, i) {
+                                            return "cosmultipath-" + i;
+                                        })
+                                        .style("stroke", "white")
+                                        .style("stroke-width", 1)
+                                        .on("mouseover", function (d) {
+                                            d3.select(this).transition()
+                                                    .duration(CosMultiChartD3Config.animduration)
+                                                    .attr("d", arcOver);
+                                        })
+                                        .on("mouseout", function (d) {
+                                            d3.select(this).transition()
+                                                    .duration(CosMultiChartD3Config.animduration)
+                                                    .attr("d", arc);
+                                        })
+                                        .transition()
+                                        .ease("exp")
+                                        .duration(0)
+                                        .attrTween("d", tweenPie);
+
+
+                            }
+                            function tweenPie(b) {
+                                var i = d3.interpolate({
+                                    startAngle: 2.1 * Math.PI,
+                                    endAngle: 2.1 * Math.PI
+                                }, b);
+                                return function (t) {
+                                    return arc(i(t));
+                                };
+                            }
+                        }
+
+                        scope.$watch('chartConfig', function(value) {
+                            if (angular.isDefined(scope.chartConfig)) {
+                                CosMultiChartD3Config = $extendObj.extendDeep(CosMultiChartD3Config, scope.chartConfig);
+                            }
+
+                            renderChart();
+                        }, true);
+
+                        scope.$watch('chartData', function (value) {
+                            renderChart();
+                        });
+                    }
+                };
+            }]);
+angular.module('att.charts.donutD3', ['att.charts.utilities'])
+        .constant("DonutChartD3Config",
+                {
+                    "chartcolor": {
+                        "paletteColors": ["#676767", "#96B1D0", "#0B2477", "#FF9900", "#81017D", "#B6BF00", "#DA0081", "#00C7B2"], //default color options for rendering chart
+                        "zeroTicketColor": ["#d3d3d3"],
+                        "centerTicketCountHoverColor":["#0574AC"]
+                    },
+                    "zoomlevel": "25",
+                    "defaultcenterlabel": "Total",
+                    "donutratio": "1.5",
+                    "initduration": "1000",
+                    "animduration": "300",
+                    "legendreqd": "false",
+                    "legendposition": "right",
+                    "centerTextLabelDy": "20",
+                    "clipMargin": "400",
+                    "arcOverMargin":10
+                })
+        .directive('attDonutd3Chart', ['DonutChartD3Config', '$timeout','$extendObj', function (DonutChartD3Config, $timeout,$extendObj) {
+                return {
+                    restrict: 'A',
+                    scope: {
+                        chartData: '=',
+                        chartColor: '=',
+                        chartConfig: '=',
+                        refreshChart: '=',
+                        onclickcallback: '&',
+                        legendclickcallback: '&',
+                        centerclickcallback: '&'
+                    },
+                    templateUrl: 'template/donutD3/attDonutd3Chart.html',
+                    transclude: true,
+                    replace: true,
+                    controller: ['$scope', '$attrs', function ($scope, $attrs) {
+                            if (angular.isDefined($scope.chartConfig)) {
+                                DonutChartD3Config = $extendObj.extendDeep(DonutChartD3Config,$scope.chartConfig);
+                            }
+                            var legendColors = [];
+                            legendColors = ($scope.chartColor) ? $scope.chartColor : DonutChartD3Config.chartcolor.paletteColors;
+                            $scope.addLegendColor = function (id, item) {
+                                if (item.value > 0) {
+                                    return {"color": legendColors[id]};
+                                } else {
+                                    return {"color": DonutChartD3Config.chartcolor.zeroTicketColor};
+                                }
+                            };
+                            $scope.chartID = $attrs.id;
+                            if (!angular.isDefined($attrs.legendRequired)) {
+                                $scope.legendRequired = DonutChartD3Config.legendreqd;
+                            } else {
+                                $scope.legendRequired = $attrs.legendRequired;
+                            }
+                            if (!angular.isDefined($attrs.legendPosition)) {
+                                $scope.legendPosition = DonutChartD3Config.legendposition;
+                            } else {
+                                $scope.legendPosition = $attrs.legendPosition;
+                            }
+                            $scope.addStyle = function (elem) {
+                                if ($scope.legendRequired && angular.isDefined($scope.legendPosition)) {
+                                    if ($attrs.legendPosition === "right") {
+                                        return "floatLeft";
+                                    } else {
+                                        if (elem === 'chartLegend')
+                                        {
+                                            return "floatLeft";
+                                        }
+                                        else
+                                        {
+                                            return "floatRight";
+                                        }
+                                    }
+                                } else {
+                                    return "floatLeft";
+                                }
+                            };
+                        }],
+                    link: function (scope, element, attrs) {
+                        scope.$watch('refreshChart', function () {
+                            if (angular.isDefined(scope.refreshChart)) {
+                                if (scope.refreshChart !== true)
+                                {
+                                    return;
+                                } else {
+                                    for (var j = 0; j < scope.chartData.length; j++) {
+                                        var chartObj =scope.chartData[j];
+                                        var className = (chartObj.name).replace(/ /g, "").toUpperCase();
+                                        angular.element(document.querySelector("[chart-legend-id=" + className + "]")).removeClass("active");
+                                    }
+                                    
+                                }
+
+                            }
+                            
+                            if (angular.isDefined(scope.chartConfig)) {
+                                DonutChartD3Config = $extendObj.extendDeep(DonutChartD3Config, scope.chartConfig);
+                            }
+                            d3.select("svg#" + attrs.id).remove();
+                            d3.selectAll("svg#" + attrs.id + " > *").remove();
+                            var selectedPath = "",
+                                    lastSelected,
+                                    pi = Math.PI;
+                            var zoom = parseInt(DonutChartD3Config.zoomlevel, 0),
+                                    coloroptions = (scope.chartColor) ? scope.chartColor : DonutChartD3Config.chartcolor.paletteColors,
+                                    defaultcenterlabel = DonutChartD3Config.defaultcenterlabel,
+                                    totalcount = 0,
+                                    margin = {// optionally set margins
+                                        top: zoom,
+                                        right: zoom,
+                                        bottom: zoom,
+                                        left: zoom
+                                    },
+                            // set height and width plus margin so zoomed area is not clipped
+                           /* width = parseInt(attrs.chartWidth, 0) - (margin.left + margin.right),
+                                    height = parseInt(attrs.chartHeight, 0) - (margin.top + margin.bottom),
+                                    radius = Math.min(
+                                            width - (margin.left + margin.right),
+                                            height - (margin.top + margin.bottom)) / 2,*/
+                             width = attrs.chartWidth,
+                                    height = attrs.chartHeight,
+                                    radius = Math.min(
+                                            width - (margin.left + margin.right),
+                                            height - (margin.top + margin.bottom)) / 2, 
+                                    color = d3.scale.ordinal().range(coloroptions);
+                            if (angular.isDefined(scope.chartData)) {
+                                for (var i in scope.chartData) {
+                                    if (angular.isDefined(scope.chartData[i].value)) {
+                                        totalcount = (totalcount + parseInt(scope.chartData[i].value, 10));
+                                    }
+                                }
+                            }
+                            
+                            var data=[];
+                            for (var z = 0; z < scope.chartData.length; z++) {
+                                var chartElem =scope.chartData[z];
+                                if(chartElem.value <= 0){
+                                    data.push({index: z, value: chartElem.value});
+                                }      
+                            }
+                            var chartStyle = d3.select(".chartContainer#" + attrs.id)
+                                    .attr("style");
+                            var chart = d3.select(".chartContainer#" + attrs.id)
+                                    .attr("style", "height: " + attrs.chartHeight + "px;width:" + attrs.chartWidth + "px;")
+                                    .append("svg")
+                                    .attr("id", attrs.id)
+                                    .attr("width", '100%')
+                                    .attr("height", '100%')
+                                    .attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
+                                    .attr('preserveAspectRatio', 'xMinYMin')
+                                    .append("g")
+                                    .attr("transform", "translate(" + Math.min(width, height) / 2 + "," + Math.min(width, height) / 2 + ")");
+                            // set radius
+                            var arc = d3.svg.arc()
+                                    .innerRadius(radius / DonutChartD3Config.donutratio)
+                                    .outerRadius(radius);
+                            // add center text element
+                            var centerTextValue = chart.append("text")
+                                    .attr("class", "donutcenterValue")
+                                    .attr("id", attrs.id + "count")
+                                    .on("click", function (d) {
+                                        var value = d3.select("g > text#" + attrs.id + "count").text();
+                                        var label = d3.select("g > text#" + attrs.id + "category").text();
+                                        if (angular.isDefined(scope.onclickcallback)) {
+                                            scope.centerclickcallback({count: value, category: label});
+                                        }
+                                    });
+                            var centerTextLabel = chart.append("text")
+                                    .attr("y", DonutChartD3Config.centerTextLabelDy)
+                                    .attr("class", "donutcenterLabel")
+                                    .attr("id", attrs.id + "category");
+
+                            centerTextValue.text(totalcount);
+                            centerTextLabel.text(defaultcenterlabel);
+                            if (totalcount <= 0) {
+                                arc.startAngle(0).endAngle(2 * pi); //just radians
+                                chart.append("path")
+                                        .attr("d", arc)
+                                        .attr("fill", DonutChartD3Config.chartcolor.zeroTicketColor);
+                            } else {
+                                // set hovered radius
+                                var arcOver = d3.svg.arc()
+                                        .innerRadius(radius / DonutChartD3Config.donutratio)
+                                        .outerRadius(radius + DonutChartD3Config.arcOverMargin);
+                                var pie = d3.layout.pie()
+                                        .sort(null)
+                                        .startAngle(1.1 * Math.PI)
+                                        .endAngle(3.1 * Math.PI)
+                                        .value(function (d) {
+                                            return d.value;
+                                        });
+                                var g = chart.selectAll(".arc")
+                                        .data(pie(scope.chartData))
+                                        .enter()
+                                        .append("g")
+                                        .attr("class", "arc")
+                                        .style("cursor", "pointer");
+                                // set fill color and animate tween
+                                g.append("path")
+                                        .style("fill", function (d) {
+                                            return color(d.data.name);
+                                        })
+                                        .attr("path-id",function (d, i) {
+                                            return "b-" + i;
+                                        })
+                                        .style("stroke", "white")
+                                        .style("stroke-width", 1)
+                                        .on("mouseover", function (d) {
+                                            d3.select(this).transition()
+                                                    .duration(DonutChartD3Config.animduration)
+                                                    .attr("d", arcOver);
+                                            
+                                            centerTextValue.text(d3.select(this).datum().data.value);
+                                            centerTextLabel.text(d3.select(this).datum().data.name);
+                                            var className = d3.select(this).datum().data.name.replace(/ /g, "").toUpperCase();
+                                            angular.element(document.querySelector("[chart-legend-id=" + className + "]")).addClass("active");
+                                        })
+                                        .on("mouseout", function (d) {
+                                            if (!this.getAttribute("clicked")) {
+                                                d3.select(this).transition()
+                                                        .duration(DonutChartD3Config.animduration)
+                                                        .attr("d", arc);
+                                                if (selectedPath.length === 0) {
+                                                    centerTextValue.text(totalcount);
+                                                    centerTextLabel.text(defaultcenterlabel);
+                                                } else {
+                                                    centerTextValue.text(selectedPath.datum().data.value);
+                                                    centerTextLabel.text(selectedPath.datum().data.name);
+                                                }
+                                                var className = d3.select(this).datum().data.name.replace(/ /g, "").toUpperCase();
+                                                angular.element(document.querySelector("[chart-legend-id=" + className + "]")).removeClass("active");
+                                            } else if (angular.isDefined(lastSelected) && lastSelected!=="") {
+                                                lastSelected.transition()
+                                                        .duration(DonutChartD3Config.animduration)
+                                                        .attr("d", arc);
+                                                if (angular.isDefined(lastSelected)) {
+                                                    var prevclassName = lastSelected.datum().data.name.replace(/ /g, "").toUpperCase();
+                                                    angular.element(document.querySelector("[chart-legend-id=" + prevclassName + "]")).removeClass("active");
+                                                }
+                                            }
+                                        })
+                                        .on("click", function (d, i) {
+                                            if (angular.isDefined(scope.onclickcallback)) {
+                                                scope.onclickcallback({name: d3.select(this).datum().data.name, value: d3.select(this).datum().data.value});
+                                            }
+                                            if (!this.getAttribute("clicked")) {
+                                                this.setAttribute("clicked", "clicked");
+                                                if (selectedPath !== "") {
+                                                    lastSelected = selectedPath;
+                                                    selectedPath[0][0].removeAttribute("clicked");
+                                                }
+                                                selectedPath = d3.select(this);
+                                            } else {
+                                                if (this.getAttribute("path-id") === selectedPath.attr("path-id")) {
+                                                    selectedPath[0][0].removeAttribute("clicked");
+                                                    selectedPath = "";
+                                                }
+                                            }
+
+                                        })
+                                        .transition()
+                                        .ease("exp")
+                                        .duration(DonutChartD3Config.initduration)
+                                        .attrTween("d", tweenPie);
+                                // animate function
+                                scope.legendMouseOver = function (item, id, e) {
+                                        selectedId="b-"+id;
+                                    if (item.value > 0) {
+                                        scope.LegendClass = "";
+                                        this.LegendClass = "active";
+                                        centerTextValue.text(item.value);
+                                        centerTextLabel.text(item.name);
+                                        d3.selectAll(".chartContainer#"+attrs.id+" "+"path").each(function(d, i) {
+                                             if(this.getAttribute("path-id")==selectedId){
+                                                 d3.select(this).transition()
+                                                .duration(DonutChartD3Config.animduration)
+                                                .attr("d", arcOver);
+                                             }
+                                        });
+                                        
+                                        d3.select("#TicketGraphcount").style('fill',DonutChartD3Config.chartcolor.centerTicketCountHoverColor);  
+                                    }
+                                };
+                                scope.legendMouseLeave = function (item, id, e) {
+                                    selectedId="b-"+id;
+                                    hoveredLegendItem=this;
+                                    if (item.value > 0) {
+                                        if (selectedPath.length === 0) {
+                                            centerTextValue.text(totalcount);
+                                            centerTextLabel.text(defaultcenterlabel);
+                                        } else {
+                                            centerTextValue.text(selectedPath.datum().data.value);
+                                            centerTextLabel.text(selectedPath.datum().data.name);
+                                        }
+                                        d3.selectAll(".chartContainer#"+attrs.id+" "+"path").each(function(d, i) {
+                                             if(this.getAttribute("path-id")==selectedId){
+                                                if(this.getAttribute("clicked")===null){
+                                                    hoveredLegendItem.LegendClass = "";
+                                                    d3.select(this).transition().duration(DonutChartD3Config.animduration).attr("d", arc); 
+                                                }
+                                             }
+                                        });
+                                        d3.select("#TicketGraphcount").style('fill', "#000");
+
+                                    }
+                                };
+                            }
+                            function tweenPie(b) {
+                                var i = d3.interpolate({
+                                    startAngle: 1.1 * Math.PI,
+                                    endAngle: 1.1 * Math.PI
+                                }, b);
+                                return function (t) {
+                                    return arc(i(t));
+                                };
+                            }
+                            $timeout(function () {
+                                var h = element.find("ul")[0].clientHeight,
+                                        fHeight = (parseInt(height, 10) - h),
+                                        className = scope.addStyle('chartContainer');
+                                fHeight = (fHeight < 0) ? 0 : fHeight;     
+                                angular.element(element[0].querySelector('.chartContainer')).addClass(className);
+                                angular.element(element[0].querySelector(".chartLegend")).css({
+                                    "margin-top": (fHeight / 2) + "px"
+                                });
+                            }, 200);
+                            for (var k = 0; k < data.length; k++) {
+                                var index =data[k].index;
+                                var zeroValIndex="b-"+index;
+                                if(data[k].value <= 0){
+                                 removeStrokelines(zeroValIndex);
+                                }
+                                       
+                            }
+                            
+                            function removeStrokelines(zeroValIndex){
+                                d3.selectAll(".chartContainer#"+attrs.id+" "+"path").each(function(d, i) {
+                                             if(this.getAttribute("path-id")==zeroValIndex){
+                                                d3.select(this).style('stroke', "").style("stroke-width", "");
+                                             }
+                                  });
+                            }
+                            scope.refreshChart = false;
+                        });
+
+                    }
+                };
+            }])
+        .filter('filterData', function () {
+            return function (input) {
+                return input.replace(/ /g, "").toUpperCase();
+            };
+        });
+angular.module('att.charts.donutFusion', [])
+        .constant("DonutChartFusionConfig",
+                {
+                    "chart": {
+                        "caption": "Tickets",
+                        "startingAngle": 0,
+                        "theme": "fist",
+                        "captionPadding": "0",
+                        "paletteColors": "#FF0066,#00CCFF,#00CC66,#6699FF,#000099,#660066,#FF6600,#4D4D4D", //default color options for rendering chart
+                        "enableSmartLabels": "0",
+                        "enableMultiSlicing": "1",
+                        "donutRadius": "65",
+                        "pieRadius": "110",
+                        "showLabels": "0",
+                        "showValues": "0",
+                        "showBorder": "0",
+                        "showpercentintooltip": "0",
+                        "bgcolor": "#FFFFFF",
+                        "defaultCenterLabel": "Total",
+                        "showshadow": 0,
+                        "centerLabel": "$value $label",
+                        "plotHoverEffect": 1,
+                        "plotBorderHoverDashGap": "50",
+                        "enableRotation": "0",
+                        "baseFont": "Arial",
+                        "baseFontColor": "#666666",
+                        "use3DLighting": "0",
+                        "numbersuffix": "",
+                        "defaultAnimation": "0",
+                        "showValuesOnHover": 0
+                    }
+                })
+        .directive('attDonutfusionChart', ['DonutChartFusionConfig', '$timeout', function (DonutChartFusionConfig, $timeout) {
+                'use strict';
+                return {
+                    restrict: 'A',
+                    scope: {
+                        chartData: '=',
+                        onclickcallback: '&'
+                    },
+                    templateUrl: 'template/donutFusion/attDonutfusionChart.html',
+                    transclude: true,
+                    replace: true,
+                    link: function (scope, element, attrs, controller, transclude) {
+                        var totalItems = 0;
+                        if (angular.isDefined(scope.chartData)) {
+                            for (var i in scope.chartData) {
+                                if(angular.isDefined(scope.chartData[i].value)){
+                                totalItems = (totalItems + parseInt(scope.chartData[i].value, 10));
+                            }
+                            }
+                        }
+                        DonutChartFusionConfig.data = scope.chartData;
+                        var donutChartDataSource = DonutChartFusionConfig;
+                        var defaultCenterLabelText;
+                        defaultCenterLabelText = totalItems + ' ' + DonutChartFusionConfig.chart.defaultCenterLabel;
+                        donutChartDataSource.chart.defaultCenterLabel = defaultCenterLabelText;
+
+                        var initChart = function () {
+                            FusionCharts.ready(function () {
+                                var donutChart = new FusionCharts({
+                                    type: 'doughnut2d',
+                                    renderAt: "donutFusionChart",
+                                    //width: '100%',
+                                    width: attrs.chartWidth,
+                                    height: attrs.chartHeight,
+                                    dataFormat: 'json',
+                                    dataSource: donutChartDataSource,
+                                    events: {
+                                        //dataPlotRollOver event is raised whenever you hover over a data plot (column, anchor of line or area, pie etc.)
+                                        "dataPlotRollOver": function (evtObj, argumentsObject) {
+                                            var selectedLabelArr = argumentsObject.toolText.split(",");
+                                            var className = selectedLabelArr[0].replace(/ /g, "").toUpperCase();
+                                            angular.element(document.querySelector("[chart-legend-id=" + className + "_fusion" + "]")).addClass("active");
+                                        },
+                                        "dataPlotRollOut": function (evtObj, argObj) {
+                                            var selectedLabelArr = argObj.toolText.split(",");
+                                            var className = selectedLabelArr[0].replace(/ /g, "").toUpperCase();
+                                            angular.element(document.querySelector("[chart-legend-id=" + className + "_fusion" + "]")).removeClass("active");
+                                        },
+                                        "dataPlotClick": function (evtObj, argObj) {
+                                            if(angular.isDefined(scope.onclickcallback)){
+                                            scope.onclickcallback({evtObj:evtObj, argObj:argObj});
+                                            }
+                                        }
+                                    }
+                                });
+                                donutChart.render();
+                                DonutChartFusionConfig.chart.defaultCenterLabel = DonutChartFusionConfig.chart.defaultCenterLabel;
+                            });
+                        };
+                        initChart();
+                        $timeout(function () {
+                            var w = element.find("ul")[0].clientHeight,
+                                    fWidth = (parseInt(attrs.chartHeight, 10) - w);
+                            element.find("ul").css("margin-top", (fWidth / 2) + "px");
+
+                        }, 200);
+                    },
+                    controller: function ($scope, $element, $attrs) {
+                        var legendColors = [];
+                        legendColors = DonutChartFusionConfig.chart.paletteColors.split(",");
+                        $scope.addLegendColor = function (id) {
+                            return {"color": legendColors[id]};
+                        };
+                        $scope.legendRequired = $attrs.legendRequired;
+
+                        $scope.addStyle = function (elem) {
+                            if ($scope.legendRequired && angular.isDefined($attrs.legendPosition)) {
+                                if ($attrs.legendPosition === "right") {
+                                    if (elem === 'chartLegend')
+                                    {
+                                        return {"float": "left"};
+                                    }
+                                    else
+                                    {
+                                        return {"float": "left"};
+                                    }
+                                } else {
+                                    if (elem === 'chartLegend')
+                                    {
+                                        return {"float": "left"};
+                                    }
+                                    else
+                                    {
+                                        return {"float": "right"};
+                                    }
+                                }
+                            } else {
+                                return {"float": "left"};
+                            }
+                        };
+                    }
+                };
+            }])
+        .filter('filterData', function () {
+            return function (input) {
+                return input.replace(/ /g, "").toUpperCase();
+            };
+        });
+angular.module('att.charts.horseshoeD3', ['att.charts.utilities'])
+        .constant("HorseShoeChartD3Config",
+                {
+                    "chartcolor": {
+                        "paletteColors": ["#1072b8", "#FEFFF7"], //default color options for rendering chart baseColor and NeedleColor,
+                        "paletteBorderColors": ["#1072b8", "#000"]
+                    },
+                    "defaultcenterlabel": "COS 1",
+                    "defaultcentercategory": "Real Time",
+                    "animduration": 500,
+                    "legendreqd": "false",
+                    "legendposition": "top",
+                    "centerTextLabelDy": "20"
+                })
+        .directive('attHorseshoed3Chart', ['HorseShoeChartD3Config', '$timeout','$extendObj', function (HorseShoeChartD3Config, $timeout,$extendObj) {
+                return {
+                    restrict: 'A',
+                    scope: {
+                        chartConfig: '=',
+                        initVal: '=',
+                        horseShoeId: '@'
+                    },
+                    templateUrl: 'template/horseshoeD3/attHorseshoeD3Chart.html',
+                    transclude: true,
+                    replace: true,
+                    controller: ['$scope', '$attrs',function ($scope, $attrs) {
+                        if (angular.isDefined($scope.chartConfig)) {
+                            HorseShoeChartD3Config = $extendObj.extendDeep(HorseShoeChartD3Config, $scope.chartConfig);
+                        }
+                        var legendColor = [];
+                        legendColor = HorseShoeChartD3Config.chartcolor.paletteColors;
+                        $scope.addLegendColor = function () {
+                            return {"color": legendColor[0]};
+                        };
+                        if (!angular.isDefined($attrs.legendRequired)) {
+                            $scope.legendRequired = HorseShoeChartD3Config.legendreqd;
+                        } else {
+                            $scope.legendRequired = $attrs.legendRequired;
+                        }
+                        if (!angular.isDefined($attrs.legendPosition)) {
+                            $scope.legendPosition = HorseShoeChartD3Config.legendposition;
+                        } else {
+                            $scope.legendPosition = $attrs.legendPosition;
+                        }
+                    }],
+                    link: function (scope, element, attrs) {
+                        var radius = Math.min(attrs.chartWidth, attrs.chartHeight) / 2;
+                        scope.LegendLabel = HorseShoeChartD3Config.defaultcenterlabel;
+                        scope.LegendCategory = HorseShoeChartD3Config.defaultcentercategory;
+                        var duration = HorseShoeChartD3Config.animduration,
+                                guageVal = parseInt(scope.initVal.value, 10);
+                        scope.guageVal = guageVal + "%";
+                        var dataset = {
+                            lower: calcPercent(0),
+                            upper: calcPercent(guageVal)
+                        },
+                        pie = d3.layout.pie().sort(null),
+                                format = d3.format(".0%");
+                        var arc = d3.svg.arc()
+                                .innerRadius(radius - 20)
+                                .outerRadius(radius)
+                                .startAngle(function (d) {
+                                    return d.startAngle + 2.6 * Math.PI / 2;
+                                })
+                                .endAngle(function (d) {
+                                    return d.endAngle + 2.6 * Math.PI / 2;
+                                });
+
+                        element[0].querySelector('.horseshoed3Container').setAttribute('id', scope.horseShoeId);
+
+                        var svg = d3.select(".horseshoed3Container#" + scope.horseShoeId)
+                                .attr("style", "height: " + attrs.chartHeight + "px;")
+                                .append("svg")
+                                .attr("id", scope.horseShoeId)
+                                .attr("width", "100%")
+                                .attr("height", "100%")
+                                .attr('viewBox', '0 0 ' + Math.min(attrs.chartWidth, attrs.chartHeight) + ' ' + Math.min(attrs.chartWidth, attrs.chartHeight))
+                                .attr('preserveAspectRatio', 'xMinYMin')
+                                .append("g")
+                                .attr("transform", "translate(" + Math.min(attrs.chartWidth, attrs.chartHeight) / 2 + "," + Math.min(attrs.chartWidth, attrs.chartHeight) / 2 + ")");
+                        var path = svg.selectAll("path")
+                                .data(pie(dataset.lower))
+                                .enter().append("path")
+                                .attr("class", function (d, i) {
+                                    return "color" + i;
+                                })
+                                .attr("fill", HorseShoeChartD3Config.chartcolor.paletteColors[1])
+                                .attr("stroke", HorseShoeChartD3Config.chartcolor.paletteBorderColors[1])
+                                .attr("d", arc)
+                                .each(function (d) {
+                                    this._current = d;
+                                }); // store the initial values
+                        // add center text element
+                        var centerTextValue = svg.append("text")
+                                .attr("class", "horseshoecenterValue");
+                        var centerTextLabel = svg.append("text")
+                                .attr("y", HorseShoeChartD3Config.centerTextLabelDy)
+                                .attr("class", "horseshoecenterLabel");
+                        if (typeof (guageVal) === "string") {
+                            centerTextValue.text(guageVal);
+                            centerTextLabel.text(HorseShoeChartD3Config.defaultcenterlabel + "(" + HorseShoeChartD3Config.defaultcentercategory + ")");
+                        }
+                        else {
+                            var progress = 0;
+                            var timeout = setTimeout(function () {
+                                clearTimeout(timeout);
+                                path = path.data(pie(dataset.upper)); // update the data
+                                path.transition().duration(duration).attrTween("d", function (a, index) {
+                                    angular.element(this)
+                                            .attr("fill", HorseShoeChartD3Config.chartcolor.paletteColors[index])
+                                            .attr("stroke", HorseShoeChartD3Config.chartcolor.paletteBorderColors[index]);
+
+                                    var i = d3.interpolate(this._current, a);
+                                    var i2 = d3.interpolate(progress, guageVal);
+                                    this._current = i(0);
+                                    return function (t) {
+                                        centerTextValue.text(format(i2(t) / 100));
+                                        centerTextLabel.text(HorseShoeChartD3Config.defaultcenterlabel + "(" + HorseShoeChartD3Config.defaultcentercategory + ")");
+                                        return arc(i(t));
+                                    };
+                                }); // redraw the arcs
+
+                            }, 200);
+                        }
+                        scope.$watch('initVal', function (value) {
+                            scope.guageVal = value.value + "%";
+                            path.data(pie(calcPercent(value.value)));
+                            path.transition().duration(duration).attrTween("d", function (a, index) {
+                                angular.element(this)
+                                        .attr("fill", HorseShoeChartD3Config.chartcolor.paletteColors[index])
+                                        .attr("stroke", HorseShoeChartD3Config.chartcolor.paletteBorderColors[index]);
+
+                                var i = d3.interpolate(this._current, a);
+                                var i2 = d3.interpolate(progress, value.value);
+                                this._current = i(0);
+                                return function (t) {
+                                    centerTextValue.text(format(i2(t) / 100));
+                                    centerTextLabel.text(HorseShoeChartD3Config.defaultcenterlabel + "(" + HorseShoeChartD3Config.defaultcentercategory + ")");
+                                    return arc(i(t));
+                                };
+                            }); // redraw the arcs
+
+                        });
+                        function calcPercent(guageVal) {
+                            return [guageVal, 100 - guageVal];
+                        }
+
+                    }
+                };
+            }]);
+angular.module('att.charts.radialguageD3', ['att.charts.utilities'])
+        .constant("RadialGuageChartD3Config",
+                {
+                    "chartcolor": {
+                        "MaxBandwidthReached": ["#efefef"],
+                        "ZeroBandwidthSelected": ["#FEFFF7"],
+                        "RemainingBandwidthColor": ["#FEFFF7"],
+                        "RemainingBandwidthStrokeColor": ["#000000"],
+                        "UsedBandwidthColor": ["#1072b8"],
+                        "MouseOverArcFillColor": ["#0091d9"],
+                        "RemainingBandwidthStrokeWidth":1,
+                        "UsedBandwidthStrokeWidth":1,
+                        "UsedBandwidthStrokeColor":["#efefef"]
+                    },
+                    "defaultcenterlabel": "Kbps",
+                    "maxAllowedUnitsLabel": "Kbps",
+                    "zoomLevel": "25",
+                    "doughnutratio": 20,
+                    "animduration": "300",
+                    "guageStartAngle":4,
+                    "guageEndAngle":8.56,
+                    "legendreqd": "false",
+                    "legendposition": "top",
+                    "centerTextLabelDy": "20",
+                    "centerTextValueDy": "0",
+                    "centerTextValueDx": "0",
+                    "centerTextLabelDx": "0",
+                    "maxbandwidthTextDx": "65",
+                    "maxbandwidthTextDy": "100",
+                    "arcOverMargin": 5
+                })
+        .directive('attRadialguaged3Chart', ['RadialGuageChartD3Config', '$timeout','$extendObj', function(RadialGuageChartD3Config, $timeout,$extendObj) {
+                return {
+                    restrict: 'A',
+                    scope: {
+                        maxValue: '=',
+                        chartData: '=',
+                        chartConfig: '=',
+                        resetChart: '=',
+                        mouseOver: '=?'
+                    },
+                    controller: ['$scope', '$attrs', function($scope, $attrs) {
+                        if (angular.isDefined($scope.chartConfig)) {
+                            RadialGuageChartD3Config = $extendObj.extendDeep(RadialGuageChartD3Config, $scope.chartConfig);
+                        }
+
+                        }],
+                    link: function(scope, element, attrs) {
+                        var zoom = parseInt(RadialGuageChartD3Config.zoomLevel, 0),
+                                margin = {// optionally set margins
+                                    top: zoom,
+                                    right: zoom,
+                                    bottom: zoom,
+                                    left: zoom
+                                },
+                        width = attrs.chartWidth,
+                                height = attrs.chartHeight,
+                                radius = Math.min(
+                                        width - (margin.left + margin.right),
+                                        height - (margin.top + margin.bottom)) / 2;
+                        // set radius
+                        var arc = d3.svg.arc()
+                                .innerRadius(radius - RadialGuageChartD3Config.doughnutratio)
+                                .outerRadius(radius);
+                        // set hovered radius
+                        var arcOver = d3.svg.arc()
+                                .innerRadius(radius - RadialGuageChartD3Config.doughnutratio)
+                                .outerRadius(radius + RadialGuageChartD3Config.arcOverMargin);
+                        // Browser onresize event
+                        window.onresize = function() {
+                            scope.$apply();
+                        };
+
+                        scope.$watch('mouseOver', function(val) {
+                            if (!angular.isDefined(scope.mouseOver)) { return; }
+                            var id = parseInt(scope.mouseOver.split('-')[1], 10);
+                            if (scope.mouseOver.split('-')[0] === 'true') {
+                                d3.select('path#radialguagepath-' + (id)).transition()
+                                    .duration(parseInt(RadialGuageChartD3Config.animduration,10))
+                                    .attr('d', arcOver);
+                                
+                            } else {
+                                d3.select('path#radialguagepath-' + (id)).transition()
+                                    .duration(parseInt(RadialGuageChartD3Config.animduration,10))
+                                    .attr('d', arc);
+                            }
+                        });
+
+                        scope.$watch('resetChart', function() {
+                            if (angular.isDefined(scope.resetChart)) {
+                                if (angular.isDefined(scope.chartData)) {
+                                    scope.render(scope.chartData, scope.chartData);
+                                }
+                                scope.resetChart = false;
+                            }
+                        });
+                        scope.$watch('chartData', function(newValue, oldValue) {
+                            return scope.render(newValue, oldValue);
+                        }, true);
+                        scope.render = function(newValue, oldValue) {
+                            d3.select("svg#" + attrs.id).remove();
+                            d3.selectAll("svg#" + attrs.id + " > *").remove();
+                            if (!scope.chartData)
+                            {
+                                return;
+                            }
+                            var color, selectedSlider, totalBandwidth = 0, totalUsed = 0, remainingBandwidth = 0;
+                            if (angular.isDefined(scope.maxValue)) {
+                                totalBandwidth = parseInt(scope.maxValue, 0);
+                            }
+                            angular.forEach(newValue, function(val, key) {
+                                totalUsed = (totalUsed + parseInt(val.value, 10));
+                                if (newValue[key].value !== oldValue[key].value) {
+                                    selectedSlider = key;
+                                }
+                            });
+                            var data = angular.copy(scope.chartData);
+                            if (totalUsed < totalBandwidth) {
+                                remainingBandwidth = totalBandwidth - parseInt(totalUsed, 0);
+                                data.push({name: "remaining", value: remainingBandwidth});
+                            }
+                            element[0].setAttribute('id', attrs.id);
+                            var svg = d3.select(element[0])
+                                    .attr("style", "height: " + attrs.chartHeight + "px;")
+                                    .append("svg")
+                                    .attr("id", attrs.id)
+                                    .attr("width", "100%")
+                                    .attr("height", "100%")
+                                    .attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
+                                    .attr('preserveAspectRatio', 'xMinYMin')
+                                    .append("g")
+                                    .attr("transform", "translate(" + Math.min(width, height) / 2 + "," + Math.min(width, height) / 2 + ")");
+
+                            var centerTextValue = svg.append("text")
+                                    .attr("y", RadialGuageChartD3Config.centerTextValueDy)
+                                    .attr("x", RadialGuageChartD3Config.centerTextValueDx)
+                                    .attr("class", "radialguagecenterValue");
+                            var centerTextLabel = svg.append("text")
+                                    .attr("y", RadialGuageChartD3Config.centerTextLabelDy)
+                                    .attr("x", RadialGuageChartD3Config.centerTextLabelDx)
+                                    .attr("class", "radialguagecenterLabel");
+                            var maxbandwidthText = svg.append("text")
+                                    .attr("y", RadialGuageChartD3Config.maxbandwidthTextDy)
+                                    .attr("x", RadialGuageChartD3Config.maxbandwidthTextDx)
+                                    .attr("class", "radialmaxbandwidthText");
+                            if (totalUsed > totalBandwidth) {
+                                totalUsed = totalBandwidth;
+                                data = [
+                                    {
+                                        name: "totalUsed",
+                                        value: "100"
+                                    }
+                                ];
+                                color = d3.scale.ordinal().range(RadialGuageChartD3Config.chartcolor.MaxBandwidthReached);
+                            } else if (totalUsed <= 0) {
+                                data = [
+                                    {
+                                        name: "totalUnUsed",
+                                        value: "100"
+                                    }
+                                ];
+                                color = d3.scale.ordinal().range(RadialGuageChartD3Config.chartcolor.ZeroBandwidthSelected);
+
+                            } else {
+                                var Colorpalette = [];
+                                if (newValue === oldValue) {
+                                    data = [
+                                        {
+                                            name: "totalUsed",
+                                            value: totalUsed
+                                        }
+                                    ];
+                                    if (remainingBandwidth > 0) {
+                                        data.push({name: "remaining", value: remainingBandwidth});
+                                    }
+                                }
+                                for (var j = 0; j < data.length - 1; j++) {
+                                    Colorpalette[j] = RadialGuageChartD3Config.chartcolor.UsedBandwidthColor;
+                                }
+                                if (remainingBandwidth > 0) {
+                                    Colorpalette.push(RadialGuageChartD3Config.chartcolor.RemainingBandwidthColor);
+                                }
+                                color = d3.scale.ordinal().range(Colorpalette);
+                            }
+
+                            centerTextValue.text(totalUsed);
+                            centerTextLabel.text(RadialGuageChartD3Config.defaultcenterlabel);
+                            maxbandwidthText.text(totalBandwidth + " " + RadialGuageChartD3Config.maxAllowedUnitsLabel);
+                            var pie = d3.layout.pie()
+                                    .sort(null)
+                                    .startAngle(RadialGuageChartD3Config.guageStartAngle)
+                                    .endAngle(RadialGuageChartD3Config.guageEndAngle)
+                                    .value(function(d) {
+                                        return d.value;
+                                    });
+
+                            var g = svg.selectAll(".arc")
+                                    .data(pie(data))
+                                    .enter()
+                                    .append("g")
+                                    .attr("class", "arc")
+                                    .attr("id", function(d, i) {
+                                        return "radialguagearc-" + i;
+                                    })
+                                    .style("cursor", "pointer");
+
+                            if (newValue === oldValue) {
+                                g.append("path")
+                                        .style("fill", function(d) {
+                                            return color(d.data.name);
+                                        })
+                                        .attr("id", function(d, i) {
+                                            return "radialguagepath-" + i;
+                                        })
+                                        .transition()
+                                        .ease("exp")
+                                        .duration(0)
+                                        .attrTween("d", tweenPie);
+                            } else {
+                                g.append("path")
+                                        .style("fill", function(d) {
+                                            return color(d.data.name);
+                                        })
+                                        .attr("id", function(d, i) {
+                                            return "radialguagepath-" + i;
+                                        })
+                                        .style("stroke", RadialGuageChartD3Config.chartcolor.RemainingBandwidthColor)
+                                        .style("stroke-width", RadialGuageChartD3Config.chartcolor.UsedBandwidthStrokeWidth)
+                                        .transition()
+                                        .ease("exp")
+                                        .duration(0)
+                                        .attrTween("d", tweenPie);
+                            }
+                            if (totalUsed === totalBandwidth || remainingBandwidth > 0) {
+                                var count = data.length - 1;
+                                d3.select("#" + attrs.id + " path#radialguagepath-" + count).style('stroke', RadialGuageChartD3Config.chartcolor.RemainingBandwidthStrokeColor).style("stroke-width", RadialGuageChartD3Config.chartcolor.RemainingBandwidthStrokeWidth);
+                            }
+                            if (angular.isDefined(selectedSlider) && remainingBandwidth > 0) {
+
+                                d3.select("#" + attrs.id + " path#radialguagepath-" + selectedSlider).transition()
+                                        .duration(RadialGuageChartD3Config.animduration)
+                                        .attr("d", arcOver);
+                                d3.select("#" + attrs.id + " path#radialguagepath-" + selectedSlider).style('fill', RadialGuageChartD3Config.chartcolor.MouseOverArcFillColor);
+                            }
+                            function tweenPie(b) {
+                                var i = d3.interpolate({
+                                    startAngle: 2.1 * Math.PI,
+                                    endAngle: 2.1 * Math.PI
+                                }, b);
+                                return function(t) {
+                                    return arc(i(t));
+                                };
+                            }
+
+                        };
+
+
+                    }
+                };
+            }]);
+angular.module('att.charts.stackedBarchart', ['att.charts.utilities'])
+        .constant("stackBarChartConfig",
+                {
+                    "chartcolor": ["#B2B2B2", "#00CC00"],
+                    "gridLineColor": "#CCCCCC",
+                    "yAxisMaxTicks": 4,
+                    "chartHeight": "200",
+                    "chartOpacity": 0.3,
+                    "amountKDivision": 1000,
+                    "amountKText": "K",
+                    "amountMDivision": 1000000,
+                    "amountMText": "M",
+                    "yearLabelPos": {"x": 10, "y": 15},
+                    "tooltipTopMargin": 110,
+                    "tooltipLeftMargin": 54,
+                    "margin": {
+                        top: 20,
+                        right: 80,
+                        bottom: 30,
+                        left: 52
+                    }
+                })
+        .directive('stackedBarChart', ['stackBarChartConfig', '$extendObj', '$timeout', function (stackBarChartConfig, $extendObj, $timeout) {
+                return {
+                    restrict: 'A',
+                    scope: {
+                        chartData: '=',
+                        legendRequired: "=",
+                        refreshChart: "=",
+                        chartConfig: "="
+                    },
+                    templateUrl: "template/stackedBarchart/stackedBarchart.html",
+                    replace: true,
+                    controller: ['$scope', '$attrs', function ($scope, $attrs) {
+                            if (angular.isDefined($scope.chartConfig)) {
+                                stackBarChartConfig = $extendObj.extendDeep(stackBarChartConfig, $scope.chartConfig);
+                            }
+                            $scope.chartID = $attrs.id;
+                            $scope.legendColors = stackBarChartConfig.chartcolor;
+                            $scope.addLegendColor = function (id) {
+                                var bgColor = null;
+                                bgColor = {"background-color": $scope.legendColors[id]};
+                                return bgColor;
+                            };
+                        }],
+                    link: function (scope, element, attrs, ctrl) {
+                        scope.tooltipFlag = false;
+                        var dataObj, idx = 0, xAxisTicks, margin = stackBarChartConfig.margin,
+                                width = parseInt(attrs.chartWidth, 10),
+                                height = parseInt(stackBarChartConfig.chartHeight, 10),
+                                padding = 20,
+                                parseDate = d3.time.format("%d-%b-%Y").parse,
+                                tooltipFormat = d3.time.format("%B-%Y"),
+                                labelFormat = d3.time.format("%Y");
+                        attrs.$observe('legendRequired', function (val) {
+                            if (val === 'true') {
+                                scope.showLegend = true;
+                            }
+                            else {
+                                scope.showLegend = false;
+                            }
+                        });
+                        scope.$watch('refreshChart', function (value) {
+                            if (value === false) {
+                                return;
+                            }
+
+                            if (angular.isDefined(scope.chartConfig)) {
+                                stackBarChartConfig = $extendObj.extendDeep(stackBarChartConfig, scope.chartConfig);
+                            }
+
+                            d3.select("svg#" + attrs.id).remove();
+                            d3.selectAll("svg#" + attrs.id + " > *").remove();
+                            d3.selectAll("div#stackBarChartContainer" + " > div").remove();
+                            if (scope.chartData[0].values.length === 0) {
+                                scope.refreshChart = false;
+                                return;
+                            }
+
+                            var xMonth = [], yDomainData = [], yAxisData = [], yValue = [], tempData = [], tooltipData = {}, yearArr = {}, isSingleMonth = false;
+
+                            //X-Axis Range        
+                            var xRange = d3.time.scale().range([padding, width - padding * 2]);
+
+                            //Y-Axis Range 
+                            var yRange = d3.scale.linear().range([height - padding, padding]);
+
+                            dataObj = scope.chartData;
+
+                            dataObj.forEach(function (data) {
+                                var obj = data.values;
+                                xAxisTicks = obj.length;
+                                if (obj.length == 1) {
+                                    isSingleMonth = true;
+                                }
+                                obj.forEach(function (d) {
+                                    var tmp = "01-" + d.month;
+                                    d.numericMonth = parseDate(tmp);
+                                    yValue.push({'value': +d.value});
+                                    d.value = +d.value;
+                                    xMonth.push({'numericMonth': d.numericMonth});
+                                });
+                            });
+
+                            //ToolTip Data
+                            for (var z = 0; z < dataObj.length; z++) {
+                                var tempSeries = dataObj[z].series;
+                                for (var j = 0; j < dataObj[z].values.length; j++) {
+                                    var months = dataObj[z].values[j].month;
+                                    var tempVal = dataObj[z].values[j].value;
+                                    var percent = dataObj[z].values[j].percent;
+                                    tempData.push({"month": months, "series": tempSeries, "value": tempVal, "percent": percent});
+                                }
+                            }
+
+                            for (var k = 0; k < tempData.length; k++) {
+                                var seriesName = tempData[k].series;
+                                var seriesVal = tempData[k].value;
+                                var seriesPer = tempData[k].percent;
+                                var tempObj = tooltipData[tempData[k].month];
+                                if (!(tempObj)) {
+                                    tempObj = [];
+                                    tooltipData[tempData[k].month] = tempObj;
+                                    tooltipData[tempData[k].month]['seriesPer'] = seriesPer;
+                                }
+                                tempObj.push({seriesName: seriesName, seriesVal: seriesVal});
+                            }
+
+                            //X-Axis Domain  
+                            xRange.domain(d3.extent(xMonth, function (d) {
+                                return d.numericMonth;
+                            }));
+
+                            for (var b = 0; b < tempData.length; b++) {
+                                var val = Math.round(parseInt(tempData[b].value, 10) / stackBarChartConfig.yAxisMaxTicks);
+                                var Calc = Math.ceil((val / Math.pow(10, ("" + val).length - 1))) * (stackBarChartConfig.yAxisMaxTicks) * Math.pow(10, ("" + val).length - 1);
+                                yDomainData.push({'yAxisVal': Calc});
+                            }
+
+                            //Y-Axis Domain
+                            yRange.domain([0, d3.max(yDomainData, function (d) {
+                                    return (d.yAxisVal);
+                                })]);
+
+                            var yTick = d3.max(yDomainData, function (d) {
+                                return d.yAxisVal;
+                            });
+
+                            yTick = yTick / stackBarChartConfig.yAxisMaxTicks;
+                            for (var x = 0; x <= stackBarChartConfig.yAxisMaxTicks; x++) {
+                                yAxisData.push(yTick * x);
+                            }
+
+                            var formatMoney = function (d) {
+                                if (d >= stackBarChartConfig.amountMDivision) {
+                                    return d / stackBarChartConfig.amountMDivision + stackBarChartConfig.amountMText;
+                                } else if (d >= stackBarChartConfig.amountKDivision) {
+                                    return d / stackBarChartConfig.amountKDivision + stackBarChartConfig.amountKText;
+                                } else {
+                                    return d;
+                                }
+                            };
+                            var xAxis = d3.svg.axis().scale(xRange).orient("bottom").tickFormat(d3.time.format('%b')).ticks(d3.time.months);
+                            var xAxisGrid = d3.svg.axis().scale(xRange).orient("top").ticks(d3.time.months).tickFormat('').tickSize(-height + 2 * padding, 0);
+
+                            var yAxis = d3.svg.axis().scale(yRange).orient("left").tickValues(yAxisData).ticks(stackBarChartConfig.yAxisMaxTicks).tickFormat(formatMoney);
+                            var yAxisGrid = d3.svg.axis().scale(yRange).orient("left").tickValues(yAxisData).ticks(stackBarChartConfig.yAxisMaxTicks).tickSize(-width, 0, 0);
+
+
+                            //Calculate values for Stack
+                            var stack = d3.layout.stack()
+                                    .values(function (d) {
+                                        return d.values;
+                                    })
+                                    .x(function (d) {
+                                        return d.numericMonth;
+                                    })
+                                    .y(function (d) {
+                                        return d.value;
+                                    });
+
+                            //Plot Chart
+                            var drawBarChart = d3.select("#stackBarChartContainer")
+                                    .append("svg")
+                                    .attr("id", attrs.id)
+                                    .data(dataObj)
+                                    .attr("width", width + margin.left + margin.right)
+                                    .attr("height", parseInt(height, 10) + parseInt(margin.top, 10) + parseInt(margin.bottom, 10))
+                                    .append("g")
+                                    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
+
+                            //Draw X Axis        
+                            drawBarChart.append("g")
+                                    .attr("class", "x axis")
+                                    .attr("transform", "translate(0," + (height - padding) + ")")
+                                    .call(xAxis);
+
+                            if (isSingleMonth) {
+                                drawBarChart.select(".x").select(".tick").attr("transform", "translate(" + (isSingleMonth === true) * (width / 2 + 20) + ",0)");
+                            }
+
+                            //Draw Y Grid Lines
+                            var yGrid = drawBarChart.append("g")
+                                    .attr("class", "grid").attr("id", "stackBarYGrid")
+                                    .attr("transform", "translate(0,0)")
+                                    .call(yAxisGrid);
+                            yGrid.selectAll("line").style("stroke", stackBarChartConfig.gridLineColor);
+                            yGrid.selectAll("text").remove();
+
+                            //Plot Bars for multiple Stacks
+                            var barGroup = drawBarChart.selectAll(".group")
+                                    .data(stack(dataObj))
+                                    .enter().append("g")
+                                    .attr("class", "group").attr("id", function (d, i) {
+                                return ("stackBar" + i);
+                            })
+                                    .attr("transform", "translate(" + (isSingleMonth === true) * width / 2 + ",0)");
+
+                            barGroup.append("title").text(function (d) {
+                                return d.series;
+                            });
+
+                            var bars = barGroup.selectAll("rect")
+                                    .data(function (d) {
+                                        return d.values;
+                                    })
+                                    .enter().append("rect")
+                                    .attr("class", "bar")
+                                    .attr("x", function (d) {
+                                        return (xRange(d.numericMonth) - 10);
+                                    })
+                                    .attr("y", function (d) {
+                                        return yRange(d.value);
+                                    })
+                                    .attr("width", "20")
+                                    .attr("height", function (d) {
+                                        return ((height - yRange(d.value)) - padding);
+                                    }).on("mouseover", function (d) {
+                                var offsetX = d3.select(this).attr("x");
+                                var offsetY = d3.select(this).attr("y");
+                                show_tooltip_grid_line(offsetX, "x");
+                                drawBarChart.selectAll(".bar").style("fill-opacity", stackBarChartConfig.chartOpacity);
+                                d3.select(this).style("fill-opacity", "1");
+                                mouseOver(d, offsetX, offsetY);
+                            }).on("mouseout", function () {
+                                hide_tooltip_grid_line(d3.select(this).attr("x"), "x");
+                                scope.tooltipFlag = false;
+                                drawBarChart.selectAll(".bar").style("fill-opacity", "1");
+                                scope.$apply();
+                            });
+
+                            bars.append('desc').append('title').text(function (d) {
+                                var nvdaObj = tooltipData[d.month];
+                                return (addTitle(nvdaObj, d));
+                            });
+
+                            //Fill color in Bars
+                            for (var a = 0; a < dataObj.length; a++) {
+                                var rectBars = drawBarChart.select('#stackBar' + a).selectAll('rect');
+                                rectBars.attr('fill', scope.legendColors[a]).attr("fill-opacity", "1");
+                            }
+
+                            // Draw the x Grid lines
+                            var xGrid = drawBarChart.append("g")
+                                    .attr("class", "grid").attr("id", "stackBarXGrid")
+                                    .attr("transform", "translate(" + (isSingleMonth === true) * width / 2 + ",0)")
+                                    .call(xAxisGrid);
+
+                            xGrid.selectAll("line").attr("transform", "translate(" + -Math.ceil((xRange(2) - xRange(1)) / 2) + "," + padding + ")")
+                                    .attr("id", function (d, i) {
+                                        return ("xGridLine" + i);
+                                    });
+
+                            //Draw dual Y axis on change of Year
+                            var yAxisObj = dataObj[0].values, yAxisIdx = 0;
+                            for (var i = 0; i < yAxisObj.length; i++) {
+                                var tmpObj = [];
+
+                                tmpObj.push({"year": labelFormat(yAxisObj[i].numericMonth), "transform": xRange(yAxisObj[i].numericMonth)});
+                                if (!yearArr[labelFormat(yAxisObj[i].numericMonth)]) {
+                                    yearArr[labelFormat(yAxisObj[i].numericMonth)] = tmpObj;
+                                }
+                            }
+                            for (var key in yearArr) {
+                                var obj = yearArr[key];
+                                var yAxisNodes = drawBarChart.append("g")
+                                        .attr("class", "y axis").attr("id", yAxisId(yAxisIdx))
+                                        .attr("transform", "translate(" + (obj[0].transform - padding) + ",0)")
+                                        .call(yAxis);
+
+                                yAxisNodes.selectAll("text").attr('class', 'ticktext');
+
+                                //Append Year Label 
+                                yAxisNodes.append("text")
+                                        .attr("transform", "rotate(0)")
+                                        .attr("y", stackBarChartConfig.yearLabelPos.y)
+                                        .attr("x", stackBarChartConfig.yearLabelPos.x)
+                                        .text(obj[0].year).attr("class", "yearLabel");
+                                yAxisIdx++;
+                            }
+
+                            function yAxisId(yAxisIdx) {
+                                return ("yAxis" + yAxisIdx);
+                            }
+
+                            //function to select first element
+                            d3.selection.prototype.first = function () {
+                                return d3.select(this[0][0]);
+                            };
+
+                            //Remove minimum value label form Y Axis
+                            var tickLabels = d3.select("#yAxis0").selectAll('.ticktext');
+                            //tickLabels.first().remove();
+                            d3.select("#yAxis1").selectAll('.ticktext').remove();
+
+                            //Add title for NVDA screen reader
+                            function addTitle(nvdaObj, d) {
+                                var temp = "";
+                                for (var y = 0; y < nvdaObj.length; y++) {
+                                    temp = temp + nvdaObj[y].seriesName + nvdaObj[y].seriesVal;
+                                }
+                                return (tooltipFormat(d.numericMonth) + "--" + temp + "Retainibility Percentage" + nvdaObj.seriesPer);
+                            }
+
+                            //MouseOver Event
+                            function mouseOver(d, offsetX, offsetY) {
+                                for (var key in tooltipData) {
+                                    if (key == d.month) {
+                                        scope.stackDataPoint = tooltipData[key];
+                                        break;
+                                    }
+                                }
+                                scope.monthPoint = {"xData": tooltipFormat(d.numericMonth).replace('-', ' ')};
+                                scope.$apply();
+                                $timeout(function () {
+                                    offsetY = offsetY - stackBarChartConfig.tooltipTopMargin;
+                                    var tooltipEl = element.children().eq(2);
+                                    var tooltipWidth = tooltipEl[0].offsetWidth;
+                                    if (isSingleMonth) {
+                                        offsetX = offsetX - (tooltipWidth / 2) + stackBarChartConfig.tooltipLeftMargin + (width / 2);
+                                    } else {
+                                        offsetX = offsetX - (tooltipWidth / 2) + stackBarChartConfig.tooltipLeftMargin;
+                                    }
+                                    scope.tooltipStyle = {"left": offsetX + "px", "top": offsetY + "px"};
+                                    scope.tooltipFlag = true;
+                                }, 0);
+                            }
+
+                            //Show Grid Line on Over
+                            function show_tooltip_grid_line(offsetX, attr) {
+                                var dataLength;
+                                dataLength = scope.chartData[0].values.length;
+                                for (var i = 0; i < dataLength; i++) {
+                                    var bar = drawBarChart.selectAll(".bar");
+                                    if (bar[0][i].getAttribute(attr) === offsetX) {
+                                        drawBarChart.select("#xGridLine" + i).style("stroke", stackBarChartConfig.gridLineColor);
+                                    }
+                                }
+                            }
+
+                            //Hide Grid Line
+                            function hide_tooltip_grid_line(offsetX, attr) {
+                                var dataLength;
+                                dataLength = scope.chartData[0].values.length;
+                                for (var i = 0; i < dataLength; i++) {
+                                    var bar = drawBarChart.selectAll(".bar");
+                                    if (bar[0][i].getAttribute(attr) === offsetX) {
+                                        drawBarChart.select("#xGridLine" + i).style("stroke", "transparent");
+                                    }
+                                }
+                            }
+                            scope.refreshChart = false;
+                        });
+                    }
+                };
+            }])
+        .filter('filterInput', function () {
+            return function (input) {
+                return input.replace(/ +/g, "").toLowerCase();
+            };
+        });
+angular.module('att.charts.stackedareachart', ['att.charts.utilities'])
+        .constant("stackChartConfig",
+                {
+                    "chartcolor": ["#9966FF", "#E68A2E", "#4DDB4D"],
+                    "gridLineColor": "#808080",
+                    "lineCurveType": 'linear',
+                    "yAxisMaxTicks": 4,
+                    "chartHeight": "200",
+                    "shapes": ['circle', 'rect', 'triangle'],
+                    "shapeSize": [3, 5, 6],
+                    "chartOpacity": 0.6,
+                    "yearLabelPos": {"x": 8, "y": -5},
+                    "tooltipTopMargin": 100,
+                    "tooltipLeftMargin": 42,
+                    "yAxisUnitRange": 500000,
+                    "margin": {
+                        top: 30,
+                        right: 80,
+                        bottom: 30,
+                        left: 52
+                    }
+                })
+        .directive('stackedAreaChart', ['stackChartConfig','$extendObj','$timeout', function (stackChartConfig,$extendObj,$timeout) {
+                return {
+                    restrict: 'A',
+                    scope: {
+                        chartData: '=',
+                        legendRequired: "=",
+                        refreshChart: "=",
+                        chartConfig: "="
+                    },
+                    templateUrl: "template/stackedareachart/stackedAreaChart.html",
+                    replace: true,
+                    controller: ['$scope', '$attrs', function ($scope, $attrs) {
+                            var extendDeep = function extendDeep(dst) {
+                              angular.forEach(arguments, function(obj) {
+                                if (obj !== dst) {
+                                  angular.forEach(obj, function(value, key) {
+                                    if (dst[key] && dst[key].constructor && dst[key].constructor === Object) {
+                                      extendDeep(dst[key], value);
+                                    } else {
+                                      dst[key] = value;
+                                    }     
+                                  });   
+                                }
+                              });
+                              return dst;
+                            };
+                            if (angular.isDefined($scope.chartConfig)) {
+                                stackChartConfig = $extendObj.extendDeep(stackChartConfig, $scope.chartConfig);
+                            }
+                            $scope.chartID = $attrs.id;
+                            $scope.legendColors = stackChartConfig.chartcolor;
+                            $scope.legendTooltipColors = angular.copy(stackChartConfig.chartcolor).reverse();
+                            $scope.addLegendColor = function (id) {
+                                var bgColor = null;
+                                switch (id) {
+                                    case 0:
+                                        bgColor = {"background-color": $scope.legendColors[id], "border-radius": "100%"};
+                                        break;
+                                    case 1:
+                                        bgColor = {"background-color": $scope.legendColors[id]};
+                                        break;
+                                    case 2:
+                                        bgColor = {"width": "0", "height": "0", "border-left": "8px solid transparent", "border-right": "8px solid transparent", "border-bottom-style": "solid", "border-bottom-width": "8px", "border-bottom-color": $scope.legendColors[id]};
+                                        break;
+                                }
+                                return bgColor;
+                            };
+                            $scope.addToolTipLegendColor = function (id) {
+                                var bgColor = null;
+                                switch (id) {
+                                    case 2:
+                                        bgColor = {"background-color": $scope.legendTooltipColors[id], "border-radius": "100%"};
+                                        break;
+                                    case 1:
+                                        bgColor = {"background-color": $scope.legendTooltipColors[id]};
+                                        break;
+                                    case 0:
+                                        bgColor = {"width": "0", "height": "0", "border-left": "6px solid transparent", "border-right": "6px solid transparent", "border-bottom-style": "solid", "border-bottom-width": "12px", "border-bottom-color": $scope.legendTooltipColors[id]};
+                                        break;
+                                }
+                                return bgColor;
+                            };
+                        }],
+                    link: function (scope, element, attrs, ctrl) {
+                        scope.tooltipFlag = false;
+                        var dataObj, idx = 0, xAxisTicks, margin = stackChartConfig.margin,
+                                width = parseInt(attrs.chartWidth, 10),
+                                height = stackChartConfig.chartHeight,
+                                parseDate = d3.time.format("%d-%b-%Y").parse,
+                                tooltipFormat = d3.time.format("%B-%Y"),
+                                labelFormat = d3.time.format("%Y");
+                        attrs.$observe('legendRequired', function (val) {
+                            if (val === 'true') {
+                                scope.showLegend = true;
+                            }
+                            else {
+                                scope.showLegend = false;
+                            }
+                        });
+                        scope.$watch('refreshChart', function (value) {
+                            if (value === false) {
+                                return;
+                            }
+                            if (angular.isDefined(scope.chartConfig)) {
+                                stackChartConfig = $extendObj.extendDeep(stackChartConfig, scope.chartConfig);
+                            }
+                            d3.select("svg#" + attrs.id).remove();
+                            d3.selectAll("svg#" + attrs.id + " > *").remove();
+                            d3.selectAll("div#stackChartContainer" + " > div").remove();
+                            if (scope.chartData[0].values.length === 0) {
+                                scope.refreshChart = false;
+                                return;
+                            }
+
+                            var xMonth = [], yValue = [], tempData = [], tooltipData = {}, yearArr = {}, yearLabel = '', isSingleMonth = false, singleMonthName, currencyFormat = 'K';
+
+                            //X-Axis Range        
+                            var xRange = d3.time.scale()
+                                    .range([0, width]);
+
+                            //Y-Axis Range 
+                            var yRange = d3.scale.linear()
+                                    .range([height, 0]);
+
+                            dataObj = scope.chartData;
+
+                            //  On selecting same month in From and To dropdowns, User should be getting graph                            
+                            if (dataObj[0].values.length === 1) {
+                                isSingleMonth = true;
+                                dataObj.forEach(function (data) {
+                                    var tmp1 = "01-" + data.values[0].month;
+                                    var tmp = parseDate(tmp1);
+                                    singleMonthName = tmp.toString().split(" ")[1];
+                                    tmp.setMonth(tmp.getMonth() + 1);
+                                    var nextMonth = tmp.toString().split(" ")[1] + "-" + tmp.getFullYear();
+                                    data.values.push({month: nextMonth, value: data.values[0].value});
+                                });
+                            }
+
+                            dataObj.forEach(function (data) {
+                                var obj = data.values;
+                                xAxisTicks = obj.length;
+                                obj.forEach(function (d) {
+                                    var tmp = "01-" + d.month;
+                                    d.numericMonth = parseDate(tmp);
+                                    yValue.push({'value': +d.value});
+                                    d.value = +d.value;
+                                    xMonth.push({'numericMonth': d.numericMonth});
+                                    if (d.value > stackChartConfig.yAxisUnitRange) {
+                                        currencyFormat = 'M';
+                                    }
+                                });
+                            });
+
+                            //ToolTip Data
+                            for (var z = 0; z < dataObj.length; z++) {
+                                var tempSeries = dataObj[z].series;
+                                for (var j = 0; j < dataObj[z].values.length; j++) {
+                                    var months = dataObj[z].values[j].month;
+                                    var tempVal = dataObj[z].values[j].value;
+                                    tempData.push({"month": months, "series": tempSeries, "value": tempVal});
+                                }
+                            }
+                            for (var k = 0; k < tempData.length; k++) {
+                                var seriesName = tempData[k].series;
+                                var seriesVal = tempData[k].value;
+                                var tempObj = tooltipData[tempData[k].month];
+                                if (!(tempObj)) {
+                                    tempObj = [];
+                                    tooltipData[tempData[k].month] = tempObj;
+                                }
+                                tempObj.push({seriesName: seriesName, seriesVal: seriesVal});
+                            }
+                            for (var d in tooltipData) {
+                                var tooltipObj = tooltipData[d];
+                                var temp = 0, monthTotalVal = 0;
+                                for (var y = 0; y < tooltipObj.length; y++) {
+                                    temp = parseFloat(tooltipObj[y].seriesVal);
+                                    monthTotalVal = monthTotalVal + temp;
+                                    tooltipObj['total'] = monthTotalVal;
+                                }
+                            }
+                            var yDomainData = [],yAxisData = [],yTicksData = [];
+                            for (var month in tooltipData) {
+                                yDomainData.push({"total": tooltipData[month].total});
+                            }
+                           
+                            //Format yAxis Labels
+                            var formatCurrency = function (d) {
+                                if (currencyFormat === 'M') {
+                                    return "$" + d / 1000000 + "M";
+                                } else {
+                                    return "$" + d / 1000 + "K";
+                                }
+                            };
+                            
+                            //X-Axis Domain  
+                            xRange.domain(d3.extent(xMonth, function (d) {
+                                return d.numericMonth;
+                            }));
+                            
+                            for (var b = 0; b < yDomainData.length; b++) {
+                                var val = Math.round(parseInt(yDomainData[b].total, 10) / stackChartConfig.yAxisMaxTicks);
+                                var Calc = Math.ceil((val / Math.pow(10, ("" + val).length - 1))) * (stackChartConfig.yAxisMaxTicks) * Math.pow(10, ("" + val).length - 1);
+                                yAxisData.push({'yAxisVal': Calc});
+                            }
+                            //Y-Axis Domain
+                            yRange.domain([0, d3.max(yAxisData, function (d) {
+                                    return (d.yAxisVal);
+                                })]);
+                            var yTick = d3.max(yAxisData, function (d) {
+                                return d.yAxisVal;
+                            });
+                            yTick = yTick / stackChartConfig.yAxisMaxTicks;
+                            for (var c = 0; c <= stackChartConfig.yAxisMaxTicks; c++) {
+                                yTicksData.push(yTick * c);
+                            }
+                            
+                            var xAxis = d3.svg.axis().scale(xRange).orient("bottom").tickFormat(d3.time.format('%b')).ticks(d3.time.months);
+                            var yAxis = d3.svg.axis().scale(yRange).orient("left").tickValues(yTicksData).ticks(stackChartConfig.yAxisMaxTicks).tickFormat(formatCurrency);
+                            var yAxisGrid = d3.svg.axis().scale(yRange).orient("left").tickValues(yTicksData).ticks(stackChartConfig.yAxisMaxTicks).tickSize(-width, 0, 0);                            
+
+                            //Calculate values for Stack
+                            var stack = d3.layout.stack()
+                                    .values(function (d) {
+                                        return d.values;
+                                    })
+                                    .x(function (d) {
+                                        return d.numericMonth;
+                                    })
+                                    .y(function (d) {
+                                        return d.value;
+                                    });
+
+                            //Draw Area  
+                            var area = d3.svg.area()
+                                    .x(function (d) {
+                                        return xRange(d.numericMonth);
+                                    })
+                                    .y0(function (d) {
+                                        return yRange(d.y0);
+                                    })
+                                    .y1(function (d) {
+                                        return yRange(d.y0 + d.y);
+                                    }).interpolate(stackChartConfig.lineCurveType);
+
+                            //Plot Chart
+                            var drawChart = d3.select("#stackChartContainer")
+                                    .append("svg")
+                                    .attr("id", attrs.id)
+                                    .data(dataObj)
+                                    .attr("width", width + margin.left + margin.right)
+                                    .attr("height", parseInt(height, 10) + parseInt(margin.top, 10) + parseInt(margin.bottom, 10))
+                                    .append("g")
+                                    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
+
+                            //Draw X Axis        
+                            drawChart.append("g")
+                                    .attr("class", "x axis")
+                                    .attr("transform", "translate(0," + height + ")")
+                                    .call(xAxis);
+
+                            //Plot Area for multiple Stacks
+                            drawChart.selectAll(".layer")
+                                    .data(stack(dataObj))
+                                    .enter().append("path")
+                                    .attr("class", "layer")
+                                    .attr("d", function (d) {
+                                        return area(d.values);
+                                    }).style("fill", function (d, i) {
+                                return scope.legendColors[i];
+                            }).style("opacity", stackChartConfig.chartOpacity).style("stroke", "#ddd").append("title")
+                                    .text(function (d) {
+                                        return d.series;
+                                    });
+
+                            //Draw dual Y axis on change of Year
+                            var yAxisObj = dataObj[0].values, yAxisIdx = 0;
+                            for (var i = 0; i < yAxisObj.length; i++) {
+                                var tmpObj = [];
+                                tmpObj.push({"year": labelFormat(yAxisObj[i].numericMonth), "transform": xRange(yAxisObj[i].numericMonth)});
+                                if (!yearArr[labelFormat(yAxisObj[i].numericMonth)]) {
+                                    yearArr[labelFormat(yAxisObj[i].numericMonth)] = tmpObj;
+                                }
+                            }
+                            for (var key in yearArr) {
+                                var obj = yearArr[key];
+                                var yAxisNodes = drawChart.append("g")
+                                        .attr("class", "y axis").attr("id", yAxisId(yAxisIdx))
+                                        .attr("transform", "translate(" + obj[0].transform + ",0)")
+                                        .call(yAxis);
+
+                                yAxisNodes.selectAll("text").attr('class', 'ticktext');
+                                //Append Year Label 
+                                yAxisNodes.append("text")
+                                        .attr("transform", "rotate(0)")
+                                        .attr("y", stackChartConfig.yearLabelPos.y)
+                                        .attr("x", stackChartConfig.yearLabelPos.x)
+                                        .text(obj[0].year).attr("class", "yearLabel");
+                                yAxisIdx++;
+                            }
+
+                            //Remove next year Y axis in case of single Month selection
+                            if (isSingleMonth) {
+                                d3.select("#yAxisId1").remove();
+                            }
+
+                            function yAxisId(yAxisIdx) {
+                                return ("yAxisId" + yAxisIdx);
+                            }
+
+                            //function to select first element
+                            d3.selection.prototype.first = function () {
+                                return d3.select(this[0][0]);
+                            };
+
+                            //Remove minimum value label form Y Axis
+                            var tickLabels = d3.select("#yAxisId0").selectAll('.ticktext');
+                            tickLabels.first().remove();
+                            d3.select("#yAxisId1").selectAll('.ticktext').remove();
+
+                            if (isSingleMonth) {
+                                drawChart.selectAll('.x.axis').selectAll('.tick').selectAll('text')[1][0].textContent = singleMonthName;
+                            }
+
+                            //Append Data Points         
+                            for (var x = 0; x < dataObj.length; x++) {
+                                drawChart.append('g').attr('id', "pathId" + x).attr("transform", "translate(" + (isSingleMonth === true) * width / 2 + ",0)");
+                                if (idx >= stackChartConfig.shapes.length) {
+                                    idx = 0;
+                                }
+                                var shape = stackChartConfig.shapes[idx], shapeToAppend;
+                                if (shape == 'rect' || shape == 'triangle') {
+                                    shapeToAppend = 'polygon';
+                                }
+                                else {
+                                    shapeToAppend = 'circle';
+                                }
+
+                                var newDataObj;
+                                if (isSingleMonth) {
+                                    newDataObj = dataObj[x].values.slice(0, 1);
+                                } else {
+                                    newDataObj = dataObj[x].values;
+                                }
+
+                                var dataPoints = drawChart.select('#pathId' + x).selectAll(shapeToAppend)
+                                        .data(newDataObj)
+                                        .enter()
+                                        .append(shapeToAppend)
+                                        .attr('class', shape);
+                                drawShapes(shape, dataPoints);
+                                idx++;
+                            }
+
+                            //Fill color in dataPoints
+                            for (var a = 0; a <= dataObj.length; a++) {
+                                var Dots = drawChart.selectAll('.' + stackChartConfig.shapes[a]);
+                                Dots.attr('fill', scope.legendColors[a]);
+                            }
+
+                            //function to draw multiple shapes for Data Points
+                            function drawShapes(shape, dataPoints) {
+                                switch (shape) {
+                                    case 'circle':
+                                        var circle = dataPoints.attr("cx", function (d) {
+                                            return xRange(d.numericMonth);
+                                        }).attr("cy", function (d) {
+                                            return yRange(d.y + d.y0);
+                                        }).attr("r", stackChartConfig.shapeSize[0]).on("mouseover", function (d) {
+                                            show_tooltip_grid_line(d3.select(this).attr("cx"), "circle", "cx");
+                                            var offsetX = Math.ceil(d3.select(this).attr("cx"));
+                                            var offsetY = Math.round(d3.select(this).attr("cy"));
+                                            d3.selectAll('svg#' + attrs.id + " " + "path").style("fill-opacity", stackChartConfig.chartOpacity);
+                                            d3.selectAll('svg#' + attrs.id + " " + "polygon").style("fill-opacity", stackChartConfig.chartOpacity);
+                                            d3.selectAll('svg#' + attrs.id + " " + "circle").style("fill-opacity", stackChartConfig.chartOpacity);
+                                            mouseOver(d, offsetX, offsetY);
+                                        }).on("mouseout", function () {
+                                            hide_tooltip_grid_line(d3.select(this).attr("cx"), "circle", "cx");
+                                            d3.selectAll('svg#' + attrs.id + " " + "path").style("fill-opacity", 1);
+                                            d3.selectAll('svg#' + attrs.id + " " + "polygon").style("fill-opacity", 1);
+                                            d3.selectAll('svg#' + attrs.id + " " + "circle").style("fill-opacity", 1);
+                                            scope.tooltipFlag = false;
+                                            scope.$apply();
+                                        });
+                                        circle.append('desc').append('title').text(function (d) {
+                                            var nvdaObj = tooltipData[d.month];
+                                            return (addTitle(nvdaObj, d));
+                                        });
+                                        break;
+                                    case 'rect':
+                                        var rect = dataPoints.attr("points", function (d) {
+                                            var x = parseInt(xRange(d.numericMonth), 10);
+                                            x = x + (stackChartConfig.shapeSize[1] / 2);
+                                            var y = parseInt(yRange(d.y + d.y0), 10);
+                                            y = y - (stackChartConfig.shapeSize[1] / 2);
+                                            var x1 = parseInt((x - stackChartConfig.shapeSize[1]), 10);
+                                            var y1 = y;
+                                            var x2 = x1;
+                                            var y2 = parseInt((y1 + stackChartConfig.shapeSize[1]), 10);
+                                            var x3 = x;
+                                            var y3 = y2;
+                                            var tmp = x2 + "," + y2 + " " + x3 + "," + y3 + " " + x + "," + y + " " + x1 + "," + y1;
+                                            return tmp;
+                                        }).attr('x', function (d) {
+                                            return xRange(d.numericMonth);
+                                        }).attr('y', function (d) {
+                                            return yRange(d.y + d.y0);
+                                        }).on("mouseover", function (d) {
+                                            show_tooltip_grid_line(d3.select(this).attr("x"), "rect", "x");
+                                            var offsetX = Math.ceil(d3.select(this).attr("x"));
+                                            var offsetY = Math.round(d3.select(this).attr("y"));
+                                            d3.selectAll('svg#' + attrs.id + " " + "path").style("fill-opacity", stackChartConfig.chartOpacity);
+                                            d3.selectAll('svg#' + attrs.id + " " + "polygon").style("fill-opacity", stackChartConfig.chartOpacity);
+                                            d3.selectAll('svg#' + attrs.id + " " + "circle").style("fill-opacity", stackChartConfig.chartOpacity);
+                                            mouseOver(d, offsetX, offsetY);
+                                        }).on("mouseout", function () {
+                                            hide_tooltip_grid_line(d3.select(this).attr("x"), "rect", "x");
+                                            d3.selectAll('svg#' + attrs.id + " " + "path").style("fill-opacity", 1);
+                                            d3.selectAll('svg#' + attrs.id + " " + "polygon").style("fill-opacity", 1);
+                                            d3.selectAll('svg#' + attrs.id + " " + "circle").style("fill-opacity", 1);
+                                            scope.tooltipFlag = false;
+                                            scope.$apply();
+                                        });
+                                        rect.append('desc').append('title').text(function (d) {
+                                            var nvdaObj = tooltipData[d.month];
+                                            return (addTitle(nvdaObj, d));
+                                        });
+                                        break;
+                                    case 'triangle':
+                                        var triangle = dataPoints.attr("points", function (d) {
+                                            var x = parseInt(xRange(d.numericMonth), 10);
+                                            var y = parseInt(yRange(d.y + d.y0), 10);
+                                            var x1 = parseInt((x - stackChartConfig.shapeSize[2]), 10);
+                                            var y1 = parseInt((y - stackChartConfig.shapeSize[2]), 10);
+                                            var x2 = parseInt((x + stackChartConfig.shapeSize[2]), 10);
+                                            var y2 = y1;
+                                            var tmp = x1 + "," + y1 + " " + x + "," + y + " " + x2 + "," + y2;
+                                            return tmp;
+                                        }).attr("transform", function (d) {
+                                            var x = parseInt(xRange(d.numericMonth), 10);
+                                            var y = parseInt(yRange(d.y + d.y0), 10);
+                                            y = y - 2;
+                                            var tmp = "rotate(180," + x + "," + y + ")";
+                                            return tmp;
+                                        }).attr('x', function (d) {
+                                            return xRange(d.numericMonth);
+                                        }).attr('y', function (d) {
+                                            return yRange(d.y + d.y0);
+                                        }).on("mouseover", function (d) {
+                                            show_tooltip_grid_line(d3.select(this).attr("x"), "triangle", "x");
+                                            var offsetX = Math.ceil(d3.select(this).attr("x"));
+                                            var offsetY = Math.round(d3.select(this).attr("y"));
+                                            d3.selectAll('svg#' + attrs.id + " " + "path").style("fill-opacity", stackChartConfig.chartOpacity);
+                                            d3.selectAll('svg#' + attrs.id + " " + "polygon").style("fill-opacity", stackChartConfig.chartOpacity);
+                                            d3.selectAll('svg#' + attrs.id + " " + "circle").style("fill-opacity", stackChartConfig.chartOpacity);
+                                            mouseOver(d, offsetX, offsetY);
+                                        }).on("mouseout", function () {
+                                            hide_tooltip_grid_line(d3.select(this).attr("x"), "triangle", "x");
+                                            d3.selectAll('svg#' + attrs.id + " " + "path").style("fill-opacity", 1);
+                                            d3.selectAll('svg#' + attrs.id + " " + "polygon").style("fill-opacity", 1);
+                                            d3.selectAll('svg#' + attrs.id + " " + "circle").style("fill-opacity", 1);
+                                            scope.tooltipFlag = false;
+                                            scope.$apply();
+                                        });
+                                        triangle.append('desc').append('title').text(function (d) {
+                                            var nvdaObj = tooltipData[d.month];
+                                            return (addTitle(nvdaObj, d));
+                                        });
+                                        break;
+                                }
+                            }
+
+                            //Draw Grid Lines
+                            drawChart.append("g")
+                                    .attr("class", "grid")
+                                    .attr("id", "yStackGrid")
+                                    .attr("transform", "translate(0,0)")
+                                    .call(yAxisGrid)
+                                    .selectAll("text").remove();
+
+                            // Draw the x Grid lines
+                            drawChart.append("g")
+                                    .attr("class", "grid")
+                                    .attr("id", "xGrid")
+                                    .attr("transform", "translate(" + (isSingleMonth === true) * width / 2 + ",0)")
+                                    .call(make_x_axis()
+                                            .tickSize(-height, 0)
+                                            .tickFormat(""));
+
+                            // function for the x grid lines
+                            function make_x_axis() {
+                                return d3.svg.axis()
+                                        .scale(xRange)
+                                        .orient("top")
+                                        .tickFormat(d3.time.format('%b')).ticks(d3.time.months);
+                            }
+
+                            drawChart.select("#xGrid").selectAll("line").style("stroke", "none");
+                            drawChart.select("#xGrid").selectAll("line")
+                                    .attr("id", function (d, i) {
+                                        return ("xAxisLine" + i);
+                                    });
+                            //Add title for NVDA screen reader
+                            function addTitle(nvdaObj, d) {
+                                var temp = "";
+                                for (var y = 0; y < nvdaObj.length; y++) {
+                                    temp = temp + nvdaObj[y].seriesName + nvdaObj[y].seriesVal;
+                                }
+                                return (tooltipFormat(d.numericMonth) + "--" + temp + "Total Charges" + nvdaObj.total);
+                            }
+
+                            //Show Grid Lines on Mouse Hover        
+                            function show_tooltip_grid_line(offsetX, shape, attr) {
+                                try {
+                                    var dataLength;
+                                    if (isSingleMonth) {
+                                        dataLength = 1;
+                                    } else {
+                                        dataLength = scope.chartData[0].values.length;
+                                    }
+
+                                    for (var i = 0; i < dataLength; i++) {
+                                        var circle = drawChart.selectAll("." + shape);
+                                        if (circle[0][i].getAttribute(attr) === offsetX) {
+                                            drawChart.select("#xAxisLine" + i).style("stroke", stackChartConfig.gridLineColor);
+                                        }
+                                    }
+                                } catch (e) {
+                                }
+                            }
+
+                            //Hide grid Lines
+                            function hide_tooltip_grid_line(offsetX, shape, attr) {
+                                try {
+                                    var dataLength;
+                                    if (isSingleMonth) {
+                                        dataLength = 1;
+                                    } else {
+                                        dataLength = scope.chartData[0].values.length;
+                                    }
+
+                                    for (var i = 0; i < dataLength; i++) {
+                                        var circle = drawChart.selectAll("." + shape);
+                                        if (circle[0][i].getAttribute(attr) === offsetX) {
+                                            drawChart.select("#xAxisLine" + i).style("stroke", "transparent");
+                                        }
+                                    }
+                                } catch (e) {
+                                }
+                            }
+
+                            //MouseOver Event
+                            function mouseOver(d, offsetX, offsetY) {
+                                for (var key in tooltipData) {
+                                    if (key == d.month) {
+                                        var data = angular.copy(tooltipData);
+                                        scope.stackDataPoint = data[key].reverse();
+                                        break;
+                                    }
+                                }
+                                var tmp = 0, monthTotalVal = 0;
+                                for (var b = 0; b < scope.stackDataPoint.length; b++) {
+                                    tmp = parseFloat(scope.stackDataPoint[b].seriesVal);
+                                    monthTotalVal = monthTotalVal + tmp;
+                                }
+                                scope.total = monthTotalVal;
+                                scope.stackDataPoint.total = monthTotalVal;
+                                
+                                scope.monthPoint = {"xData": tooltipFormat(d.numericMonth).replace('-', ' ')};
+                                scope.$apply();
+                                $timeout(function(){
+                                  offsetY = offsetY - stackChartConfig.tooltipTopMargin;
+                                var tooltipEl = element.children().eq(2);
+                                var tooltipWidth = tooltipEl[0].offsetWidth;
+                                if (isSingleMonth) {
+                                    offsetX = offsetX - (tooltipWidth/2) + stackChartConfig.tooltipLeftMargin + (width / 2);
+                                } else {
+                                    offsetX = offsetX - (tooltipWidth/2) + stackChartConfig.tooltipLeftMargin;
+                                }  
+                                scope.tooltipStyle = {"left": offsetX + "px", "top": offsetY + "px"};    
+                                scope.tooltipFlag = true;    
+                                },0);
+                                
+
+                                
+                                
+                            }
+                            //fix for removing upper text if it is below to year label
+//                            try {
+//                                var lastTickPostion = drawChart.selectAll('#yAxisId0').selectAll('.tick')[0].length - 1;
+//                                var lastGridPos = drawChart.select("#yStackGrid").selectAll('.tick')[0].length - 1;
+//                                var val = drawChart.selectAll('#yAxisId0').selectAll('.tick')[0][lastTickPostion].attributes.transform.value.split(',')[1].split(')')[0];
+//                                if (val < 20) {
+//                                    drawChart.selectAll('#yAxisId0').selectAll('text')[0][lastTickPostion - 1].remove();
+//                                    drawChart.select("#yStackGrid").selectAll('.tick')[0][lastGridPos].remove();
+//                                }
+//                            } catch (e) {
+//                            }
+                            scope.refreshChart = false;
+                        });
+                    }
+                };
+            }])
+        .filter('filterInput', function () {
+            return function (input) {
+                return input.replace(/ +/g, "").toLowerCase();
+            };
+        });
+angular.module("template/areachartD3/attAreaChartD3.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/areachartD3/attAreaChartD3.html",
+    "<div class=\"areaChartD3\">\n" +
+    "    <ul class=\"legendsList\" ng-show=\"showLegend\">\n" +
+    "        <li ng-repeat=\"label in legendLabel\" id=\"{{label.series|filterInput}}\">\n" +
+    "            <i class=\"legend-icon\" ng-style=\"addLegendColor($index)\"></i>{{label.series}}\n" +
+    "        </li>\n" +
+    "    </ul>\n" +
+    "    <div id=\"areaChartContainer\">\n" +
+    "    </div>\n" +
+    "    <div ng-class=\"{'tooltip--on': tooltipFlag,'tooltip': !tooltipFlag}\" ng-style=\"tooltipStyle\">\n" +
+    "        <span class=\"title\">{{dataPoint.xData}}</span>\n" +
+    "        <p>\n" +
+    "            <span class=\"alignLeft\"><i class=\"legend-icon\" ng-style=\"addLegendColor(1)\"></i>Available</span>\n" +
+    "            <span class=\"alignRight\">{{dataPoint.dataAvailable}} <span>{{dataPoint.usageDataType}}</span></span>\n" +
+    "        </p>\n" +
+    "        <div style=\"clear:both\"></div>          \n" +
+    "        <p>\n" +
+    "            <span class=\"alignLeft\"><i class=\"legend-icon\" ng-style=\"addLegendColor(0)\"></i>Used</span>\n" +
+    "            <span class=\"alignRight\">{{dataPoint.dataUsed}} <span>{{dataPoint.availableDataType}}</span></span>\n" +
+    "        </p>\n" +
+    "        <div style=\"clear:both\"></div>\n" +
+    "        <p ng-show=\"overageFlag\">\n" +
+    "            <span class=\"alignLeft\"><i class=\"legend-icon\" ng-style=\"addLegendColor(2)\"></i>Overage</span> \n" +
+    "            <span class=\"alignRight\">{{dataPoint.overage}}</span>\n" +
+    "        </p>\n" +
+    "        <div style=\"clear:both\"></div>\n" +
+    "        <p ng-show=\"underageFlag\">\n" +
+    "            <span class=\"alignLeft\">Buffer</span> \n" +
+    "            <span class=\"alignRight\">{{dataPoint.underage}}</span>\n" +
+    "        </p>\n" +
+    "        <div style=\"clear:both\"></div>\n" +
+    "        <span class=\"tooltipArrow\"></span>\n" +
+    "    </div>\n" +
+    "</div>");
+}]);
+
+angular.module("template/barchartD3/attBarChartD3.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/barchartD3/attBarChartD3.html",
+    "<div class=\"barChartD3\">\n" +
+    "    <div id=\"barChartContainer\">\n" +
+    "        <span class=\"tooltip\" ng-class=\"{'tooltip--on': tooltipFlag}\" ng-show=\"tooltipFlag\" ng-style=\"tooltipStyle\">\n" +
+    "            <span class=\"title\">{{dataPoint.name}}</span>\n" +
+    "            <span><span class=\"alignText\">Wireless number</span><span style=\"float:right\">{{dataPoint.phoneNumber}}</span></span>\n" +
+    "            <span><span class=\"alignText\">Charges</span><span style=\"float:right\">{{dataPoint.charges}}</span></span>\n" +
+    "            <span class=\"tooltipArrow\"></span>\n" +
+    "        </span>\n" +
+    "    </div>\n" +
+    "</div>");
+}]);
+
+angular.module("template/coschartD3/attCosd3Chart.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/coschartD3/attCosd3Chart.html",
+    "<div class=\"attCosd3Chart\">\n" +
+    "    <div class=\"chartLegend\" ng-if=\"legendPosition == 'top' && legendRequired\">\n" +
+    "        <ul>\n" +
+    "            <li ng-style=\"addLegendColor()\">\n" +
+    "                <div>\n" +
+    "                    <span class=\"LegendLabel\">{{LegendLabel}}</span> <span class=\"LegendCategory\">{{LegendCategory}}</span> <span class=\"legendItemValue\">({{cosval}})</span>\n" +
+    "                </div>\n" +
+    "            </li>\n" +
+    "        </ul>\n" +
+    "    </div>\n" +
+    "    <div id={{chartID}} class=\"cosd3Container\"></div>\n" +
+    "    <div class=\"chartLegend\" ng-if=\"legendPosition == 'bottom' && legendRequired\">\n" +
+    "        <ul>\n" +
+    "            <li ng-style=\"addLegendColor()\">\n" +
+    "                <div>\n" +
+    "                    <span class=\"LegendLabel\">{{LegendLabel}}</span> <span class=\"LegendCategory\">{{LegendCategory}}</span> <span class=\"legendItemValue\">({{cosval}})</span>\n" +
+    "                </div>\n" +
+    "            </li>\n" +
+    "        </ul>\n" +
+    "    </div>\n" +
+    "</div>");
+}]);
+
+angular.module("template/coschartwithbarD3/attCosBarD3Chart.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/coschartwithbarD3/attCosBarD3Chart.html",
+    "<div class=\"attCosWithBard3Chart\">\n" +
+    "    <div id={{chartID}} class=\"cosd3Container\"></div>\n" +
+    "    <div id={{snickrbarId}} class=\"snickrBar\" ng-if=\"barRequired\"></div>\n" +
+    "</div>");
+}]);
+
+angular.module("template/cosmultichartD3/attCosmultid3Chart.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/cosmultichartD3/attCosmultid3Chart.html",
+    "<div class=\"attCosmultid3Chart\">\n" +
+    "    <div class=\"chartLegend\" ng-if=\"legendPosition == 'top' && legendRequired\">\n" +
+    "        <ul>\n" +
+    "          <li ng-repeat=\"item in chartData\" ng-style=\"addLegendColor($index,item)\" chart-legend-id=\"{{item.name}}\">\n" +
+    "                <div>\n" +
+    "                    <span class=\"LegendLabel\">{{item.name}}</span> <span class=\"LegendCategory\">{{item.category}}</span> <span class=\"legendItemValue\">({{item.value}}%)</span>\n" +
+    "                </div>\n" +
+    "            </li>\n" +
+    "        </ul>\n" +
+    "    </div>\n" +
+    "    <div id={{chartID}} class=\"cosmultid3Container\"></div>\n" +
+    "    <div class=\"chartLegend\" ng-if=\"legendPosition == 'bottom' && legendRequired\">\n" +
+    "        <ul>\n" +
+    "            <li ng-repeat=\"item in chartData\" ng-style=\"addLegendColor($index,item)\" chart-legend-id=\"{{item.name}}\">\n" +
+    "                <div>\n" +
+    "                    <span class=\"LegendLabel\">{{item.name}}</span> <span class=\"LegendCategory\">{{item.category}}</span> <span class=\"legendItemValue\">({{item.value}}%)</span>\n" +
+    "                </div>\n" +
+    "            </li>\n" +
+    "        </ul>\n" +
+    "    </div>\n" +
+    "</div>");
+}]);
+
+angular.module("template/donutD3/attDonutd3Chart.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/donutD3/attDonutd3Chart.html",
+    "<div class=\"attDonutd3Chart\">\n" +
+    "    <div id={{chartID}} class=\"chartContainer\" ng-class=\"addStyle('chartContainer')\"></div>\n" +
+    "    <div ng-show=\"legendRequired\" chartLegend class=\"chartLegend\" ng-class=\"addStyle('chartLegend')\">\n" +
+    "        <ul>\n" +
+    "            <li ng-repeat=\"item in chartData\" ng-style=\"addLegendColor($index,item)\" chart-legend-id=\"{{item.name|filterData}}\" ng-mouseover=\"legendMouseOver(item,$index,$event)\" ng-mouseleave=\"legendMouseLeave(item,$index,$event)\" ng-class=\"LegendClass\" ng-click=\"legendclickcallback({name:item.name , value:item.value})\">\n" +
+    "                <div ng-class=\"{'emptyticket-category': item.value ===0}\" >\n" +
+    "                    <span class=\"legendItemName\">{{item.name}}</span> <span class=\"legendItemValue\">({{item.value}})</span>\n" +
+    "                </div>\n" +
+    "            </li>\n" +
+    "        </ul>\n" +
+    "    </div>\n" +
+    "    <div style=\"clear: both;\"></div>\n" +
+    "</div>");
+}]);
+
+angular.module("template/donutFusion/attDonutfusionChart.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/donutFusion/attDonutfusionChart.html",
+    "<div class=\"attDonutfusionChart\">\n" +
+    "    <div id=\"donutFusionChart\" chartContainer class=\"chartContainer\" ng-style=\"addStyle('chartContainer')\"></div>\n" +
+    "    <div ng-show=\"legendRequired\" chartLegend class=\"chartLegend\" ng-style=\"addStyle('chartLegend')\">\n" +
+    "        <ul>\n" +
+    "            <li ng-repeat=\"item in chartData\" ng-show=\"item.value > 0\" ng-style=\"addLegendColor($index)\">\n" +
+    "                <div chart-legend-id=\"{{item.name|filterData}}_fusion\">\n" +
+    "                    <span class=\"legendItemName\">{{item.name}}</span> <span class=\"legendItemValue\">({{item.value}})</span>\n" +
+    "                </div>\n" +
+    "            </li>\n" +
+    "        </ul>\n" +
+    "    </div>\n" +
+    "    <div style=\"clear: both;\">\n" +
+    "    </div>\n" +
+    "</div>    ");
+}]);
+
+angular.module("template/horseshoeD3/attHorseshoeD3Chart.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/horseshoeD3/attHorseshoeD3Chart.html",
+    "<div class=\"attHorseshoed3Chart\">\n" +
+    "    <div class=\"chartLegend\" ng-if=\"legendPosition == 'top' && legendRequired\">\n" +
+    "        <ul>\n" +
+    "            <li ng-style=\"addLegendColor()\">\n" +
+    "                <div>\n" +
+    "                    <span class=\"LegendLabel\">{{LegendLabel}}</span> <span class=\"LegendCategory\">{{LegendCategory}}</span> <span class=\"legendItemValue\">({{guageVal}})</span>\n" +
+    "                </div>\n" +
+    "            </li>\n" +
+    "        </ul>\n" +
+    "    </div>\n" +
+    "    <div class=\"horseshoed3Container\"></div>\n" +
+    "    <div class=\"chartLegend\" ng-if=\"legendPosition == 'bottom' && legendRequired\">\n" +
+    "        <ul>\n" +
+    "            <li ng-style=\"addLegendColor()\">\n" +
+    "                <div>\n" +
+    "                    <span class=\"LegendLabel\">{{LegendLabel}}</span> <span class=\"LegendCategory\">{{LegendCategory}}</span> <span class=\"legendItemValue\">({{guageVal}})</span>\n" +
+    "                </div>\n" +
+    "            </li>\n" +
+    "        </ul>\n" +
+    "    </div>\n" +
+    "</div>");
+}]);
+
+angular.module("template/stackedBarchart/stackedBarchart.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/stackedBarchart/stackedBarchart.html",
+    "<div class=\"stackedBarChart\">\n" +
+    "    <ul class=\"legendsList\" ng-show=\"showLegend\">\n" +
+    "        <li ng-repeat=\"label in chartData\" id=\"{{label.series|filterInput}}\">\n" +
+    "            <i class=\"legend-icon\" ng-style=\"addLegendColor($index)\"></i>{{label.series}}\n" +
+    "        </li>\n" +
+    "    </ul>\n" +
+    "    <div id=\"stackBarChartContainer\"></div>\n" +
+    "    <div ng-class=\"{'tooltip--on': tooltipFlag,'tooltip': !tooltipFlag}\" ng-style=\"tooltipStyle\">\n" +
+    "        <span class=\"title\">{{monthPoint.xData}}</span>\n" +
+    "        <div ng-repeat=\"label in stackDataPoint\">\n" +
+    "            <p>\n" +
+    "                <span class=\"alignLeft\"><i class=\"legend-icon-stackedchart\" ng-style=\"addLegendColor($index)\"></i>{{label.seriesName}}</span>\n" +
+    "                <span class=\"alignRight\">{{label.seriesVal| number:0}}</span>\n" +
+    "            </p> \n" +
+    "\n" +
+    "            <div style=\"clear:both\"></div>\n" +
+    "        </div>\n" +
+    "        <p>\n" +
+    "            <span class=\"alignLeft\"><i class=\"legend-icon-stackedchart\"></i>Retainability percentage</span>\n" +
+    "            <span class=\"alignRight\">{{stackDataPoint.seriesPer}}</span>\n" +
+    "\n" +
+    "        </p>\n" +
+    "        <div style=\"clear:both\"></div>\n" +
+    "        <span class=\"tooltipArrow\"></span>\n" +
+    "    </div>\n" +
+    "</div>");
+}]);
+
+angular.module("template/stackedareachart/stackedAreaChart.html", []).run(["$templateCache", function($templateCache) {
+  $templateCache.put("template/stackedareachart/stackedAreaChart.html",
+    "<div class=\"stackedAreaChart\">\n" +
+    "    <ul class=\"legendsList\" ng-show=\"showLegend\">\n" +
+    "        <li ng-repeat=\"label in chartData\" id=\"{{label.series|filterInput}}\">\n" +
+    "            <i class=\"legend-icon\" ng-style=\"addLegendColor($index)\"></i>{{label.series}}\n" +
+    "        </li>\n" +
+    "    </ul>\n" +
+    "    <div id=\"stackChartContainer\"></div>\n" +
+    "    <div ng-class=\"{'tooltip--on': tooltipFlag,'tooltip': !tooltipFlag}\" ng-style=\"tooltipStyle\">\n" +
+    "        <span class=\"title\">{{monthPoint.xData}}</span>\n" +
+    "        <div ng-repeat=\"label in stackDataPoint\">\n" +
+    "            <p>\n" +
+    "                <span class=\"alignLeft\"><i class=\"legend-icon-stackedchart\" ng-style=\"addToolTipLegendColor($index)\"></i>{{label.seriesName}}</span>\n" +
+    "                <span class=\"alignRight\">{{label.seriesVal| currency}}</span>\n" +
+    "            </p>\n" +
+    "            <div style=\"clear:both\"></div>  \n" +
+    "        </div>\n" +
+    "        <p>\n" +
+    "            <span class=\"alignLeft\">Total charges</span>\n" +
+    "            <span class=\"alignRight\">{{stackDataPoint.total| currency}}</span>\n" +
+    "        </p>\n" +
+    "        <div style=\"clear:both\"></div>\n" +
+    "        <span class=\"tooltipArrow\"></span>\n" +
+    "    </div>\n" +
+    "</div>");
+}]);