(function (factory) { if (typeof module === 'object' && typeof module.exports !== "undefined") { module.exports = factory; } else { factory(FusionCharts); } }(function (FusionCharts) { /** * @license FusionCharts JavaScript Library * Copyright FusionCharts Technologies LLP * License Information at * * @version 3.12.0 */ /** * @private * * @module fusioncharts.renderer.javascript.ssgrid * @export fusioncharts.ssgrid.js * */ FusionCharts.register('module', ['private', 'modules.renderer.js-ssgrid', function () { var global = this, lib = global.hcLib, BLANKSTRING = lib.BLANKSTRING, pluck = lib.pluck, pluckNumber = lib.pluckNumber, chartAPI = lib.chartAPI, convertColor = lib.graphics.convertColor, getFirstColor = lib.getFirstColor, setLineHeight = lib.setLineHeight, win = global.window, math = Math, mathMin = math.min, mathMax = math.max, mathCeil = math.ceil, mathRound = math.round, toRaphaelColor = lib.toRaphaelColor, PXSTRING = 'px', M = 'M', L = 'L', UNDEFINED, POSITION_START = lib.POSITION_START, HUNDREDSTRING = lib.HUNDREDSTRING, COLOR_TRANSPARENT = lib.COLOR_TRANSPARENT, creditLabel = false && !lib.CREDIT_REGEX.test(win.location.hostname); chartAPI('ssgrid', { standaloneInit: true, creditLabel: creditLabel, friendlyName: 'ssgrid Chart', defaultDatasetType: 'ssgrid', canvasBorderThickness: 1, singleseries: true, bgColor: '#FFFFFF', bgAlpha: 100, _drawCaption: function () { }, _drawCanvas: function () { }, _createAxes: function () { // Empty stub because subset of guages (pyramid, funnel) dont use axis. }, _feedAxesRawData: function () { // Empty stub because subset of guages (pyramid, funnel) dont use axis. }, _setCategories: function () { // Empty stub because subset of guages category. }, _setAxisLimits: function () { // Empty stub because subset of guages axis. }, _spaceManager: function () { var dataset = this.components.dataset[0]; dataset._manageSpace && this._allocateSpace(dataset._manageSpace()); } }, chartAPI.sscartesian); FusionCharts.register('component', ['dataset', 'ssgrid', { init: function (datasetJSON) { var dataSet = this, chart = dataSet.chart, visible; if (!datasetJSON) { return false; } dataSet.JSONData = datasetJSON; dataSet.chartGraphics = chart.chartGraphics; dataSet.components = { }; dataSet.config = { }; dataSet.graphics = { }; dataSet.visible = visible = pluckNumber(dataSet.JSONData.visible, !Number(dataSet.JSONData.initiallyhidden), 1) === 1; dataSet.configure(); }, configure: function () { var dataSet = this, chart = dataSet.chart, conf = dataSet.config, chartAttr = chart.jsonData.chart || {}, colorM = chart.components.colorManager, isBar = chart.isBar; // Fill color conf.plotFillAngle = pluckNumber(360 - chartAttr.plotfillangle, (isBar ? 180 : 90)); conf.plotFillAlpha = pluck(chartAttr.plotfillalpha, HUNDREDSTRING); // Border conf.plotBorderAlpha = pluck(chartAttr.plotborderalpha, HUNDREDSTRING); conf.plotBorderColor = pluck(chartAttr.plotbordercolor, colorM.getColor('plotBorderColor')); conf.plotDashLen = pluckNumber(chartAttr.plotborderdashlen, 5); conf.plotDashGap = pluckNumber(chartAttr.plotborderdashgap, 4); //Now, store all parameters //Whether to show percent values? conf.showPercentValues = pluckNumber(chartAttr.showpercentvalues, 0); //Number of items per page conf.numberItemsPerPage = pluckNumber(chartAttr.numberitemsperpage) || UNDEFINED; //Whether to show shadow conf.showShadow = pluckNumber(chartAttr.showshadow, 0); //Font Properties conf.baseFont = pluck(chartAttr.basefont, 'Verdana,sans'); conf.baseFontSize = pluck(chartAttr.basefontsize, 10) + PXSTRING; conf.baseFontColor = getFirstColor(pluck(chartAttr.basefontcolor, colorM.getColor('baseFontColor'))); //Alternate Row Color conf.alternateRowBgColor = getFirstColor(pluck(chartAttr.alternaterowbgcolor, colorM.getColor('altHGridColor'))); conf.alternateRowBgAlpha = pluck(chartAttr.alternaterowbgalpha, colorM.getColor('altHGridAlpha')) + BLANKSTRING; //List divider properties conf.listRowDividerThickness = pluckNumber(chartAttr.listrowdividerthickness, 1); conf.listRowDividerColor = getFirstColor(pluck(chartAttr.listrowdividercolor, colorM.getColor('borderColor'))); conf.listRowDividerAlpha = pluckNumber(pluckNumber(chartAttr.listrowdivideralpha, colorM.getColor('altHGridAlpha') + 15)) + BLANKSTRING; //Color box properties conf.colorBoxWidth = pluckNumber(chartAttr.colorboxwidth, 8); conf.colorBoxHeight = pluckNumber(chartAttr.colorboxheight, 8); //Navigation Properties conf.navButtonRadius = pluckNumber(chartAttr.navbuttonradius, 7); conf.navButtonColor = getFirstColor(pluck(chartAttr.navbuttoncolor, colorM.getColor('canvasBorderColor'))); conf.navButtonHoverColor = getFirstColor(pluck(chartAttr.navbuttonhovercolor, colorM.getColor('altHGridColor'))); //Paddings conf.textVerticalPadding = pluckNumber(chartAttr.textverticalpadding, 3); conf.navButtonPadding = pluckNumber(chartAttr.navbuttonpadding, 5); conf.colorBoxPadding = pluckNumber(chartAttr.colorboxpadding, 10); conf.valueColumnPadding = pluckNumber(chartAttr.valuecolumnpadding, 10); conf.nameColumnPadding = pluckNumber(chartAttr.namecolumnpadding, 5); // Shadow conf.shadow = pluckNumber(chartAttr.showshadow, 0) ? { enabled: true, opacity: conf.plotFillAlpha / 100 } : false; // Reset the pageIndex while data is updated. dataSet.currentPage = 0; dataSet._setConfigure(); }, _setConfigure: function () { var dataSet = this, chart = dataSet.chart, conf = dataSet.config, JSONData = dataSet.JSONData, setDataArr = chart.jsonData && chart.jsonData.data, setDataLen = setDataArr && setDataArr.length || 0, prevDataLen = JSONData && JSONData.data && JSONData.data.length || 0, len = mathMax(setDataLen, prevDataLen), components = chart.components, colorM = components.colorManager, NumberFormatter = components.numberFormatter, index = dataSet.index || dataSet.positionIndex, plotColor = conf.plotColor = colorM.getPlotColor(index), parseUnsafeString = lib.parseUnsafeString, formatedVal, plotDashLen, plotDashGap, plotBorderThickness = conf.plotBorderThickness, plotFillRatio, plotBorderDashStyle, initailPlotBorderDashStyle = conf.plotBorderDashStyle, setData, setValue, dataObj, config, getDashStyle = lib.getDashStyle, dataStore = dataSet.components.data, plotFillAlpha, dataLabel, toolTipValue, setDisplayValue, setDataDashed, setDataPlotDashLen, setDataPlotDashGap, i, actualDataLen = 0, sumOfValues = 0, textStyle, tempIndex; if (!dataStore) { dataStore = dataSet.components.data = []; } // Parsing the attributes and values at set level. for (i = 0; i < len && setDataArr; i++) { setData = setDataArr[i]; // If setData is not defined, remove the previously stored data from dataStore. if (!setData) { // dataStore[i] && dataStore.splice(i, len); continue; } setValue = NumberFormatter.getCleanValue(setData.value); dataLabel = parseUnsafeString(pluck(setData.label, setData.name)); dataObj = config = UNDEFINED; if (setValue == null && dataLabel == BLANKSTRING) { continue; } else { dataObj = dataStore[actualDataLen] || (dataStore[actualDataLen] = { 'config': {} }); config = dataObj.config; } config.tooltext = setData.tooltext; config.showValue = pluckNumber(setData.showvalue, conf.showValues); config.setValue = setValue = NumberFormatter.getCleanValue(setData.value); config.setLink = pluck(setData.link); config.toolTipValue = toolTipValue = NumberFormatter.dataLabels(setValue); config.setDisplayValue = setDisplayValue = parseUnsafeString(setData.displayvalue); // display value and label config.displayValue = NumberFormatter.dataLabels(setValue) || BLANKSTRING; config.dataLabel = parseUnsafeString(pluck(setData.label, setData.name)) || BLANKSTRING; setDataDashed = pluckNumber(setData.dashed); setDataPlotDashLen = pluckNumber(setData.dashlen, plotDashLen); setDataPlotDashGap = plotDashGap = pluckNumber(setData.dashgap, conf.plotDashGap); sumOfValues = sumOfValues + setValue; actualDataLen += 1; config.plotBorderDashStyle = plotBorderDashStyle = setDataDashed === 1 ? getDashStyle(setDataPlotDashLen, setDataPlotDashGap, plotBorderThickness) : (setDataDashed === 0 ? 'none' : initailPlotBorderDashStyle); plotColor = pluck(setData.color, colorM.getPlotColor(pluckNumber((tempIndex - len), i))); plotFillRatio = pluck(setData.ratio, conf.plotFillRatio); plotFillAlpha = pluck(setData.alpha, conf.plotFillAlpha); // config.colorArr = colorArr = lib.graphics.getColumnColor(); config.color = convertColor(plotColor, plotFillAlpha); config.borderColor = convertColor(conf.plotBorderColor, pluck(setData.alpha, conf.plotBorderAlpha).toString()); formatedVal = config.toolTipValue; tempIndex++; } // Creating the text style for SSGrid textStyle = { fontFamily: conf.baseFont, fontSize: conf.baseFontSize, color: conf.baseFontColor }; setLineHeight(textStyle); conf.textStyle = textStyle; conf.actualDataLen = actualDataLen; conf.sumOfValues = sumOfValues; }, _manageSpace: function () { var dataSet = this, chart = dataSet.chart, conf = dataSet.config, smartLabel = chart.linkedItems.smartLabel, dataStore = dataSet.components.data, chartConfig = chart.config, chartAttr = chart.jsonData.chart || {}, borderThickness = chartConfig.borderThickness = pluckNumber(chartAttr.showborder, 1) ? pluckNumber(chartAttr.borderthickness, 1) : 0, chartHeight = chartConfig.height - (borderThickness * 2), chartWidth = chartConfig.width - (borderThickness * 2), textStyle = conf.textStyle, actualDataLen = conf.actualDataLen, sumOfValues = conf.sumOfValues, components = chart.components, NumberFormatter = components.numberFormatter, maxValWidth = 0, i, config, rowHeight, itemsPerPage, cHeight, maxHeight, numItems, maxLabelWidth, dataObj, textSizeObj, len; // setting the style to LabelManagement smartLabel.useEllipsesOnOverflow(chartConfig.useEllipsesWhenOverflow); smartLabel.setStyle (textStyle); len = dataStore.length; for (i = 0; i < len; i++) { dataObj = dataStore[i]; if (!dataObj) { continue; } config = dataObj && dataObj.config; // If show values as percent conf.showPercentValues && (config.displayValue = NumberFormatter.percentValue(config.setValue / sumOfValues * 100)); //Now, we need to iterate through the value fields to get the max width //Simulate textSizeObj = smartLabel.getOriSize(config.displayValue); //Store maximum width maxValWidth = mathMax(maxValWidth, (textSizeObj.width + conf.valueColumnPadding)); } //Get the max of two maxHeight = parseInt(textStyle.lineHeight, 10); //Add text vertical padding (for both top and bottom) maxHeight = maxHeight + 2 * conf.textVerticalPadding; //Also compare with color box height - as that's also an integral part maxHeight = mathMax(maxHeight, (conf.colorBoxHeight + conf.listRowDividerThickness)); //Now that we have the max possible height, we need to calculate the page length. //First check if we can fit all items in a single page numItems = chartHeight / maxHeight; //Now, there are two different flows from here on w.r.t calculation of height //Case 1: If the user has specified his own number of items per page if (conf.numberItemsPerPage && numItems >= conf.numberItemsPerPage) { //In this case, we simply divide the page into the segments chosen by user //If all items are able to fit in this single page if (conf.numberItemsPerPage >= actualDataLen) { //This height is perfectly alright and we can fit all //items in a single page //Set number items per page to total items. conf.numberItemsPerPage = actualDataLen; //So, NO need to show the navigation buttons rowHeight = chartHeight / conf.numberItemsPerPage; //End Index itemsPerPage = actualDataLen; } else { //We need to allot space for the navigation buttons cHeight = chartHeight; //Deduct the radius and padding of navigation buttons from height cHeight = cHeight - 2 * (conf.navButtonPadding + conf.navButtonRadius); //Now, get the maximum possible number of items that we can fit in each page itemsPerPage = conf.numberItemsPerPage; //Height for each row rowHeight = cHeight / itemsPerPage; } } else { //Case 2: If we've to calculate best fit. We already have the maximum height //required by each row of data. //Storage for maximum height //Now, get the height required for any single text field //We do not consider wrapping. if (numItems >= actualDataLen) { //We can fit all items in one page rowHeight = (chartHeight / actualDataLen); //Navigation buttons are not required. //End Index itemsPerPage = actualDataLen; } else { //We cannot fit all items in same page. So, need to show //navigation buttons. Reserve space for them. //We need to allot space for the navigation buttons cHeight = chartHeight; //Deduct the radius and padding of navigation buttons from height cHeight = cHeight - 2 * (conf.navButtonPadding + conf.navButtonRadius); //Now, get the maximum possible number of items that we can fit in each page itemsPerPage = Math.floor (cHeight / maxHeight); //Height for each row rowHeight = cHeight / itemsPerPage; } } //Now, we calculate the maximum avaiable width for data label column maxLabelWidth = chartWidth - conf.colorBoxPadding - conf.colorBoxWidth - conf.nameColumnPadding - maxValWidth - conf.valueColumnPadding; conf.labelX = conf.colorBoxPadding + conf.colorBoxWidth + conf.nameColumnPadding; conf.valueX = conf.colorBoxPadding + conf.colorBoxWidth + conf.nameColumnPadding + maxLabelWidth + conf.valueColumnPadding; conf.valueColumnPadding = conf.valueColumnPadding; conf.rowHeight = rowHeight; conf.itemsPerPage = itemsPerPage; conf.listRowDividerAttr = { 'stroke-width': conf.listRowDividerThickness, stroke: convertColor(conf.listRowDividerColor, conf.listRowDividerAlpha) }; conf.alternateRowColor = convertColor(conf.alternateRowBgColor, conf.alternateRowBgAlpha); return { top: 0, bottom: 0 }; }, draw: function () { var dataSet = this, conf = dataSet.config, // visible = dataSet.visible, chart = dataSet.chart, chartComponents = chart.components, smartLabel = chart.linkedItems.smartLabel, paper = chartComponents.paper, layers = chart.graphics, datasetGroup = layers.datasetGroup, components = dataSet.components, dataStore = components.data, prevDataLen = dataStore.length, setDataArr = chart.jsonData && chart.jsonData.data, setDataLen = setDataArr && setDataArr.length || 0, len = mathMax(setDataLen, prevDataLen), graphics = dataSet.graphics, container, chartConfig = chart.config, borderThickness = chartConfig.borderThickness, xPos = borderThickness, yPos = borderThickness, width = chart.config.width - chartConfig.borderThickness, alternateRowColor = toRaphaelColor(conf.alternateRowColor), rowHeight = conf.rowHeight, listRowDividerAttr = conf.listRowDividerAttr, listRowDividerWidth = listRowDividerAttr['stroke-width'], halfW = (listRowDividerWidth % 2 / 2), colorBoxX = conf.colorBoxPadding + borderThickness, colorBoxHeight = conf.colorBoxHeight, colorBoxWidth = conf.colorBoxWidth, labelX = conf.labelX + borderThickness, valueX = conf.valueX + borderThickness, textStyle = conf.textStyle, // actualDataLen = conf.actualDataLen, itemsPerPage = conf.itemsPerPage, pageIndex = 0, currentPage = dataSet.currentPage || (dataSet.currentPage = 0), eventArgs = {}, displayValueWidth, i, dataObj, config, setValue, alternateRowElem, crispY, listRowDivideElem, colorBoxElem, labelTextEle, valueTextEle; /* * Creating a container group for the graphic element of column plots if * not present and attaching it to its parent group. */ if (!dataSet.graphics.container) { dataSet.graphics.container = []; } dataSet.currentPage = currentPage = mathMin(mathCeil(len / itemsPerPage) - 1, currentPage); // Create plot elements. for (i = 0; i < len; i++) { // Create individual group to store graphics elements page wise. if ((i + 1) % itemsPerPage == 1 || itemsPerPage == 1 || !container) { yPos = borderThickness; container = dataSet.graphics.container[pageIndex]; if (!container) { container = dataSet.graphics.container[pageIndex] = paper.group('grid-' + pageIndex, datasetGroup); } (pageIndex !== currentPage) ? container.hide() : container.show(); pageIndex += 1; eventArgs = { pageId: pageIndex, data: [] }; container.data('eventArgs', eventArgs); } dataObj = dataStore[i]; if (!dataObj) { continue; } config = dataObj && dataObj.config; setValue = config && config.setValue; graphics = dataObj && (dataObj.graphics || (dataObj.graphics = {})); if (i >= setDataLen) { graphics.alternateRow && graphics.alternateRow.remove(); graphics.alternateRow = UNDEFINED; graphics.listRowDivideElem && graphics.listRowDivideElem.remove(); graphics.listRowDivideElem = UNDEFINED; graphics.element && graphics.element.remove(); graphics.element = UNDEFINED; graphics.label && graphics.label.remove(); graphics.label = UNDEFINED; graphics.displayValue && graphics.displayValue.remove(); graphics.displayValue = UNDEFINED; graphics.listRowDivideElem && graphics.listRowDivideElem.remove(); graphics.listRowDivideElem = UNDEFINED; continue; } if (i % 2 === 0) { if (!graphics.alternateRow) { alternateRowElem = graphics.alternateRow = paper.rect(); } container.appendChild(graphics.alternateRow); graphics.alternateRow.attr({ x: xPos, y: yPos + (conf.listRowDividerThickness * 0.5), width: width - borderThickness, height: rowHeight, // r: 0, fill: alternateRowColor, 'stroke-width': 0 }); } // Draw the color BOX if (!graphics.element) { colorBoxElem = graphics.element = paper.rect(); } container.appendChild(graphics.element); graphics.element.attr({ x: colorBoxX, y: yPos + (rowHeight / 2) - (colorBoxHeight / 2), width: colorBoxWidth, height: colorBoxHeight, // r: 0, fill : config.color, 'stroke-width': 0, stroke: '#000000' }) .shadow(conf.shadow); // Draw value text displayValueWidth = smartLabel.getSmartText(config.displayValue).width || 0; if (!graphics.displayValue) { valueTextEle = graphics.displayValue = paper.text(); } container.appendChild(graphics.displayValue); graphics.displayValue.attr({ text: config.displayValue, // title: (set.originalText || ''), x: valueX, y: (yPos + (rowHeight / 2)), fill: textStyle.color, direction: conf.textDirection, 'text-anchor': POSITION_START }) .css (textStyle); // Draw label text if (!graphics.label) { labelTextEle = graphics.label = paper.text(); } config.label = smartLabel.getSmartText(config.dataLabel, width - (displayValueWidth + colorBoxWidth + colorBoxX), rowHeight); container.appendChild(graphics.label); graphics.label.attr({ text: config.label.text, // title: (set.originalText || ''), x: labelX, y: (yPos + (rowHeight / 2)), fill: textStyle.color, direction: conf.textDirection, 'text-anchor': POSITION_START }) .css(textStyle); // Store data point configuration in container eventArgs.data.push({ color: config.color, displayValue: config.displayValue, label: config.dataLabel, originalText: config.label.text, y: (yPos + (rowHeight / 2)) }); yPos += rowHeight; crispY = mathRound(yPos) + halfW; if (!graphics.listRowDivideElem) { listRowDivideElem = graphics.listRowDivideElem = paper.path(); } container.appendChild(graphics.listRowDivideElem); graphics.listRowDivideElem.attr('path', [M, xPos, crispY, L, width, crispY]) .attr(listRowDividerAttr); } // Reset extra pages for (len = dataSet.graphics.container.length - 1; len >= pageIndex; len -= 1) { container = dataSet.graphics.container; container[len].remove(); container.splice(len, 1); } this._drawSSGridNavButton(); }, _drawSSGridNavButton: function () { var dataSet = this, chart = dataSet.chart, conf = dataSet.config, actualDataLen = conf.actualDataLen, itemsPerPage = conf.itemsPerPage, graphics = dataSet.graphics, paper = chart.components.paper, width = chart.config.width, borderThickness = chart.config.borderThickness, // Navigation button drawing properties navButtonColor = conf.navButtonColor, navButtonHoverColor = conf.navButtonHoverColor, navButtonPadding = conf.navButtonPadding, radius = conf.navButtonRadius, radiusFregment = radius * 0.67, pageHeight = conf.itemsPerPage * conf.rowHeight, y = borderThickness + navButtonPadding + radiusFregment + pageHeight + radius * 0.5, x = 20 + borderThickness, nextEleX = width - x, layers = chart.graphics, trackerLayer = layers.trackerGroup, pageNavigationLayer = layers.pageNavigationLayer, pagePreNavigationLayer = layers.pagePreNavigationLayer, pageNextNavigationLayer = layers.pageNextNavigationLayer, len = graphics.container.length, currentPage = dataSet.currentPage, navElePrv, navTrackerPrv, navEleNxt, navTrackerNxt; if (!pageNavigationLayer) { pageNavigationLayer = layers.pageNavigationLayer = paper.group('page-nav', trackerLayer); } if (!pagePreNavigationLayer) { pagePreNavigationLayer = layers.pagePreNavigationLayer = paper.group('page-prev-nav', pageNavigationLayer); } if (!pageNextNavigationLayer) { pageNextNavigationLayer = layers.pageNextNavigationLayer = paper.group('page-next-nav', pageNavigationLayer); } if (actualDataLen > itemsPerPage) { pageNavigationLayer.show(); // Draw the previous arrow icon if (!graphics.navElePrv) { graphics.navElePrv = paper.path(pagePreNavigationLayer); } navElePrv = graphics.navElePrv.attr({ 'path': [ M, x, y, L, x + radius + radiusFregment, y - radiusFregment, x + radius, y, x + radius + radiusFregment, y + radiusFregment, 'Z' ], 'fill': navButtonColor, 'stroke-width': 0, 'cursor': 'pointer' }); // Draw the previous tracker circle if (!graphics.navTrackerPrv) { navTrackerPrv = graphics.navTrackerPrv = paper.circle(pagePreNavigationLayer) .mouseover (function () { navElePrv.attr ({ fill: navButtonHoverColor, cursor: 'pointer' }); }) .mouseout (function () { navElePrv.attr ({ fill: navButtonColor }); }) .click (function () { dataSet._nenagitePage(-1); }); } navTrackerPrv = graphics.navTrackerPrv.attr({ cx: x + radius, cy: y, r: radius, fill: COLOR_TRANSPARENT, 'stroke-width': 0, cursor: 'pointer' }); // Draw the next arrow icon if (!graphics.navEleNxt) { navEleNxt = graphics.navEleNxt = paper.path(pageNextNavigationLayer); } navEleNxt = graphics.navEleNxt.attr({ 'path': [M, nextEleX, y, L, nextEleX - radius - radiusFregment, y - radiusFregment, nextEleX - radius, y, nextEleX - radius - radiusFregment, y + radiusFregment, 'Z' ], fill: navButtonColor, 'stroke-width': 0, cursor: 'pointer' }); // Draw the next tracker circle if (!graphics.navTrackerNxt) { navTrackerNxt = graphics.navTrackerNxt = paper.circle(pageNextNavigationLayer) .mouseover(function () { navEleNxt.attr({ fill: navButtonHoverColor }); }) .mouseout(function () { navEleNxt.attr({ fill: navButtonColor }); }) .click(function () { dataSet._nenagitePage(1); }); } navTrackerNxt = graphics.navTrackerNxt.attr({ cx: nextEleX - radius, cy: y, r: radius, fill: COLOR_TRANSPARENT, 'stroke-width': 0, cursor: 'pointer' }); (currentPage === 0) ? pagePreNavigationLayer.hide() : pagePreNavigationLayer.show(); (currentPage === len - 1) ? pageNextNavigationLayer.hide() : pageNextNavigationLayer.show(); } else { pageNavigationLayer.hide(); } }, _nenagitePage: function (page) { var dataSet = this, chart = dataSet.chart, container = dataSet.graphics.container, currentPage = dataSet.currentPage, layers = chart.graphics, pagePreNavigationLayer = layers.pagePreNavigationLayer, pageNextNavigationLayer = layers.pageNextNavigationLayer, len = container.length, eventArgs; // Show/hide the page buttons if (container[currentPage + page]) { container[currentPage].hide(); container[currentPage + page].show(); currentPage = dataSet.currentPage += page; } eventArgs = container[currentPage].data('eventArgs'); /** * This event is fired on page change in SSGrid chart. * * @event FusionCharts#pageNavigated * @group chart * * @param {object} data - Contains data of the sought page, with color, displayValue, originalText, * value and y position for each data points. * @param {number} pageId - Tells the index of the sought page. */ global.raiseEvent('pageNavigated', { pageId: currentPage, data: eventArgs.data }, chart.chartInstance); // Show/hide the navigation buttons (currentPage === 0) ? pagePreNavigationLayer.hide() : pagePreNavigationLayer.show(); (currentPage === len - 1) ? pageNextNavigationLayer.hide() : pageNextNavigationLayer.show(); } }]); }, [3, 2, 0, 'sr2']]); }));