corrade-nucleus-nucleons – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 /**
2 * @license Highcharts JS v5.0.10 (2017-03-31)
3 * Accessibility module
4 *
5 * (c) 2010-2017 Highsoft AS
6 * Author: Oystein Moseng
7 *
8 * License: www.highcharts.com/license
9 */
10 'use strict';
11 (function(factory) {
12 if (typeof module === 'object' && module.exports) {
13 module.exports = factory;
14 } else {
15 factory(Highcharts);
16 }
17 }(function(Highcharts) {
18 (function(H) {
19 /**
20 * Accessibility module
21 *
22 * (c) 2010-2017 Highsoft AS
23 * Author: Oystein Moseng
24 *
25 * License: www.highcharts.com/license
26 */
27  
28 var win = H.win,
29 doc = win.document,
30 each = H.each,
31 erase = H.erase,
32 addEvent = H.addEvent,
33 removeEvent = H.removeEvent,
34 fireEvent = H.fireEvent,
35 dateFormat = H.dateFormat,
36 merge = H.merge,
37 // Human readable description of series and each point in singular and plural
38 typeToSeriesMap = {
39 'default': ['series', 'data point', 'data points'],
40 'line': ['line', 'data point', 'data points'],
41 'spline': ['line', 'data point', 'data points'],
42 'area': ['line', 'data point', 'data points'],
43 'areaspline': ['line', 'data point', 'data points'],
44 'pie': ['pie', 'slice', 'slices'],
45 'column': ['column series', 'column', 'columns'],
46 'bar': ['bar series', 'bar', 'bars'],
47 'scatter': ['scatter series', 'data point', 'data points'],
48 'boxplot': ['boxplot series', 'box', 'boxes'],
49 'arearange': ['arearange series', 'data point', 'data points'],
50 'areasplinerange': ['areasplinerange series', 'data point', 'data points'],
51 'bubble': ['bubble series', 'bubble', 'bubbles'],
52 'columnrange': ['columnrange series', 'column', 'columns'],
53 'errorbar': ['errorbar series', 'errorbar', 'errorbars'],
54 'funnel': ['funnel', 'data point', 'data points'],
55 'pyramid': ['pyramid', 'data point', 'data points'],
56 'waterfall': ['waterfall series', 'column', 'columns'],
57 'map': ['map', 'area', 'areas'],
58 'mapline': ['line', 'data point', 'data points'],
59 'mappoint': ['point series', 'data point', 'data points'],
60 'mapbubble': ['bubble series', 'bubble', 'bubbles']
61 },
62 // Descriptions for exotic chart types
63 typeDescriptionMap = {
64 boxplot: ' Box plot charts are typically used to display groups of statistical data. ' +
65 'Each data point in the chart can have up to 5 values: minimum, lower quartile, median, upper quartile and maximum. ',
66 arearange: ' Arearange charts are line charts displaying a range between a lower and higher value for each point. ',
67 areasplinerange: ' These charts are line charts displaying a range between a lower and higher value for each point. ',
68 bubble: ' Bubble charts are scatter charts where each data point also has a size value. ',
69 columnrange: ' Columnrange charts are column charts displaying a range between a lower and higher value for each point. ',
70 errorbar: ' Errorbar series are used to display the variability of the data. ',
71 funnel: ' Funnel charts are used to display reduction of data in stages. ',
72 pyramid: ' Pyramid charts consist of a single pyramid with item heights corresponding to each point value. ',
73 waterfall: ' A waterfall chart is a column chart where each column contributes towards a total end value. '
74 };
75  
76 // If a point has one of the special keys defined, we expose all keys to the
77 // screen reader.
78 H.Series.prototype.commonKeys = ['name', 'id', 'category', 'x', 'value', 'y'];
79 H.Series.prototype.specialKeys = [
80 'z', 'open', 'high', 'q3', 'median', 'q1', 'low', 'close'
81 ];
82  
83 // A pie is always simple. Don't quote me on that.
84 if (H.seriesTypes.pie) {
85 H.seriesTypes.pie.prototype.specialKeys = [];
86 }
87  
88  
89 // Default a11y options
90 H.setOptions({
91 accessibility: {
92 enabled: true,
93 pointDescriptionThreshold: 30, // set to false to disable
94 keyboardNavigation: {
95 enabled: true
96 // skipNullPoints: false
97 }
98 // describeSingleSeries: false
99 }
100 });
101  
102 /**
103 * HTML encode some characters vulnerable for XSS.
104 * @param {string} html The input string
105 * @return {string} The excaped string
106 */
107 function htmlencode(html) {
108 return html
109 .replace(/&/g, '&')
110 .replace(/g, '<')
111 .replace(/>/g, '>')
112 .replace(/"/g, '"')
113 .replace(/'/g, ''')
114 .replace(/\//g, '/');
115 }
116  
117 // Utility function. Reverses child nodes of a DOM element
118 function reverseChildNodes(node) {
119 var i = node.childNodes.length;
120 while (i--) {
121 node.appendChild(node.childNodes[i]);
122 }
123 }
124  
125 // Utility function to attempt to fake a click event on an element
126 function fakeClickEvent(element) {
127 var fakeEvent;
128 if (element && element.onclick && doc.createEvent) {
129 fakeEvent = doc.createEvent('Events');
130 fakeEvent.initEvent('click', true, false);
131 element.onclick(fakeEvent);
132 }
133 }
134  
135 // Whenever drawing series, put info on DOM elements
136 H.wrap(H.Series.prototype, 'render', function(proceed) {
137 proceed.apply(this, Array.prototype.slice.call(arguments, 1));
138 if (this.chart.options.accessibility.enabled) {
139 this.setA11yDescription();
140 }
141 });
142  
143 // Put accessible info on series and points of a series
144 H.Series.prototype.setA11yDescription = function() {
145 var a11yOptions = this.chart.options.accessibility,
146 firstPointEl = this.points && this.points.length && this.points[0].graphic && this.points[0].graphic.element,
147 seriesEl = firstPointEl && firstPointEl.parentNode || this.graph && this.graph.element || this.group && this.group.element; // Could be tracker series depending on series type
148  
149 if (seriesEl) {
150 // For some series types the order of elements do not match the order of points in series
151 // In that case we have to reverse them in order for AT to read them out in an understandable order
152 if (seriesEl.lastChild === firstPointEl) {
153 reverseChildNodes(seriesEl);
154 }
155 // Make individual point elements accessible if possible. Note: If markers are disabled there might not be any elements there to make accessible.
156 if (this.points && (this.points.length < a11yOptions.pointDescriptionThreshold || a11yOptions.pointDescriptionThreshold === false)) {
157 each(this.points, function(point) {
158 if (point.graphic) {
159 point.graphic.element.setAttribute('role', 'img');
160 point.graphic.element.setAttribute('tabindex', '-1');
161 point.graphic.element.setAttribute('aria-label', a11yOptions.pointDescriptionFormatter && a11yOptions.pointDescriptionFormatter(point) ||
162 point.buildPointInfoString());
163 }
164 });
165 }
166 // Make series element accessible
167 if (this.chart.series.length > 1 || a11yOptions.describeSingleSeries) {
168 seriesEl.setAttribute('role', 'region');
169 seriesEl.setAttribute('tabindex', '-1');
170 seriesEl.setAttribute('aria-label', a11yOptions.seriesDescriptionFormatter && a11yOptions.seriesDescriptionFormatter(this) ||
171 this.buildSeriesInfoString());
172 }
173 }
174 };
175  
176 // Return string with information about series
177 H.Series.prototype.buildSeriesInfoString = function() {
178 var typeInfo = typeToSeriesMap[this.type] || typeToSeriesMap['default'], // eslint-disable-line dot-notation
179 description = this.description || this.options.description;
180 return (this.name ? this.name + ', ' : '') +
181 (this.chart.types.length === 1 ? typeInfo[0] : 'series') + ' ' + (this.index + 1) + ' of ' + (this.chart.series.length) +
182 (this.chart.types.length === 1 ? ' with ' : '. ' + typeInfo[0] + ' with ') +
183 (this.points.length + ' ' + (this.points.length === 1 ? typeInfo[1] : typeInfo[2])) +
184 (description ? '. ' + description : '') +
185 (this.chart.yAxis.length > 1 && this.yAxis ? '. Y axis, ' + this.yAxis.getDescription() : '') +
186 (this.chart.xAxis.length > 1 && this.xAxis ? '. X axis, ' + this.xAxis.getDescription() : '');
187 };
188  
189 // Return string with information about point
190 H.Point.prototype.buildPointInfoString = function() {
191 var point = this,
192 series = point.series,
193 a11yOptions = series.chart.options.accessibility,
194 infoString = '',
195 dateTimePoint = series.xAxis && series.xAxis.isDatetimeAxis,
196 timeDesc = dateTimePoint && dateFormat(a11yOptions.pointDateFormatter && a11yOptions.pointDateFormatter(point) || a11yOptions.pointDateFormat ||
197 H.Tooltip.prototype.getXDateFormat(point, series.chart.options.tooltip, series.xAxis), point.x),
198 hasSpecialKey = H.find(series.specialKeys, function(key) {
199 return point[key] !== undefined;
200 });
201  
202 // If the point has one of the less common properties defined, display all that are defined
203 if (hasSpecialKey) {
204 if (dateTimePoint) {
205 infoString = timeDesc;
206 }
207 each(series.commonKeys.concat(series.specialKeys), function(key) {
208 if (point[key] !== undefined && !(dateTimePoint && key === 'x')) {
209 infoString += (infoString ? '. ' : '') + key + ', ' + point[key];
210 }
211 });
212 } else {
213 // Pick and choose properties for a succint label
214 infoString = (this.name || timeDesc || this.category || this.id || 'x, ' + this.x) + ', ' +
215 (this.value !== undefined ? this.value : this.y);
216 }
217  
218 return (this.index + 1) + '. ' + infoString + '.' + (this.description ? ' ' + this.description : '');
219 };
220  
221 // Get descriptive label for axis
222 H.Axis.prototype.getDescription = function() {
223 return this.userOptions && this.userOptions.description || this.axisTitle && this.axisTitle.textStr ||
224 this.options.id || this.categories && 'categories' || 'values';
225 };
226  
227 // Pan along axis in a direction (1 or -1), optionally with a defined granularity (number of steps it takes to walk across current view)
228 H.Axis.prototype.panStep = function(direction, granularity) {
229 var gran = granularity || 3,
230 extremes = this.getExtremes(),
231 step = (extremes.max - extremes.min) / gran * direction,
232 newMax = extremes.max + step,
233 newMin = extremes.min + step,
234 size = newMax - newMin;
235 if (direction < 0 && newMin < extremes.dataMin) {
236 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { newMin = extremes.dataMin;
237 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { newMax = newMin + size;
238 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { } else if (direction > 0 && newMax > extremes.dataMax) {
239 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { newMax = extremes.dataMax;
240 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { newMin = newMax - size;
241 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { }
242 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { this.setExtremes(newMin, newMax);
243 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { };
244  
245 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { // Whenever adding or removing series, keep track of types present in chart
246 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { H.wrap(H.Series.prototype, 'init', function(proceed) {
247 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { proceed.apply(this, Array.prototype.slice.call(arguments, 1));
248 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { var chart = this.chart;
249 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { if (chart.options.accessibility.enabled) {
250 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { chart.types = chart.types || [];
251  
252 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { // Add type to list if does not exist
253 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { if (chart.types.indexOf(this.type) < 0) {
254 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { chart.types.push(this.type);
255 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { }
256  
257 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { addEvent(this, 'remove', function() {
258 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { var removedSeries = this,
259 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { hasType = false;
260  
261 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { // Check if any of the other series have the same type as this one. Otherwise remove it from the list.
262 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { each(chart.series, function(s) {
263 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { if (s !== removedSeries && chart.types.indexOf(removedSeries.type) < 0) {
264 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { hasType = true;
265 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { }
266 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { });
267 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { if (!hasType) {
268 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { erase(chart.types, removedSeries.type);
269 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { }
270 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { });
271 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { }
272 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { });
273  
274 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { // Return simplified description of chart type. Some types will not be familiar to most screen reader users, but we try.
275 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { H.Chart.prototype.getTypeDescription = function() {
276 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { var firstType = this.types && this.types[0],
277 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { mapTitle = this.series[0] && this.series[0].mapTitle;
278 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { if (!firstType) {
279 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return 'Empty chart.';
280 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { } else if (firstType === 'map') {
281 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return mapTitle ? 'Map of ' + mapTitle : 'Map of unspecified region.';
282 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { } else if (this.types.length > 1) {
283 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return 'Combination chart.';
284 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { } else if (['spline', 'area', 'areaspline'].indexOf(firstType) > -1) {
285 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return 'Line chart.';
286 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { }
287 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return firstType + ' chart.' + (typeDescriptionMap[firstType] || '');
288 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { };
289  
290 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { // Return object with text description of each of the chart's axes
291 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { H.Chart.prototype.getAxesDescription = function() {
292 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { var numXAxes = this.xAxis.length,
293 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { numYAxes = this.yAxis.length,
294 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { desc = {},
295 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { i;
296  
297 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { if (numXAxes) {
298 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { desc.xAxis = 'The chart has ' + numXAxes + (numXAxes > 1 ? ' X axes' : ' X axis') + ' displaying ';
299 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { if (numXAxes < 2) {
300 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) { desc.xAxis += this.xAxis[0].getDescription() + '.';
301 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) { } else {
302 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) { for (i = 0; i < numXAxes - 1; ++i) {
303 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { desc.xAxis += (i ? ', ' : '') + this.xAxis[i].getDescription();
304 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { }
305 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { desc.xAxis += ' and ' + this.xAxis[i].getDescription() + '.';
306 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { }
307 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { }
308  
309 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { if (numYAxes) {
310 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { desc.yAxis = 'The chart has ' + numYAxes + (numYAxes > 1 ? ' Y axes' : ' Y axis') + ' displaying ';
311 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { if (numYAxes < 2) {
312 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) { desc.yAxis += this.yAxis[0].getDescription() + '.';
313 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) { } else {
314 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) { for (i = 0; i < numYAxes - 1; ++i) {
315 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { desc.yAxis += (i ? ', ' : '') + this.yAxis[i].getDescription();
316 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
317 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { desc.yAxis += ' and ' + this.yAxis[i].getDescription() + '.';
318 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
319 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
320  
321 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return desc;
322 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
323  
324 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set a11y attribs on exporting menu
325 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.addAccessibleContextMenuAttribs = function() {
326 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var exportList = this.exportDivElements;
327 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (exportList) {
328 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set tabindex on the menu items to allow focusing by script
329 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set role to give screen readers a chance to pick up the contents
330 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(exportList, function(item) {
331 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (item.tagName === 'DIV' &&
332 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { !(item.children && item.children.length)) {
333 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { item.setAttribute('role', 'menuitem');
334 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { item.setAttribute('tabindex', -1);
335 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
336 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
337 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set accessibility properties on parent div
338 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportList[0].parentNode.setAttribute('role', 'menu');
339 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportList[0].parentNode.setAttribute('aria-label', 'Chart export');
340 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
341 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
342  
343 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highlight a point (show tooltip and display hover state). Returns the highlighted point.
344 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Point.prototype.highlight = function() {
345 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var chart = this.series.chart;
346 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (this.graphic && this.graphic.element.focus) {
347 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.graphic.element.focus();
348 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
349 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!this.isNull) {
350 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.onMouseOver(); // Show the hover marker
351 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Show the tooltip
352 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.tooltip) {
353 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.tooltip.refresh(chart.tooltip.shared ? [this] : this);
354 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
355 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { } else {
356 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.tooltip) {
357 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.tooltip.hide(0);
358 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
359 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Don't call blur on the element, as it messes up the chart div's focus
360 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
361 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightedPoint = this;
362 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this;
363 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
364  
365 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Function to highlight next/previous point in chart
366 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Returns highlighted point on success, false on failure (no adjacent point to highlight in chosen direction)
367 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.highlightAdjacentPoint = function(next) {
368 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var series = this.series,
369 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPoint = this.highlightedPoint,
370 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPointIndex = curPoint && curPoint.index || 0,
371 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPoints = curPoint && curPoint.series.points,
372 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries,
373 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newPoint,
374 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Handle connecting ends - where the points array has an extra last
375 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // point that is a reference to the first one. We skip this.
376 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { forwardSkipAmount = curPoint && curPoint.series.connectEnds &&
377 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPointIndex > curPoints.length - 3 ? 2 : 1;
378  
379 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // If no points, return false
380 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!series[0] || !series[0].points) {
381 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return false;
382 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
383  
384 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Use first point if none already highlighted
385 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!curPoint) {
386 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return series[0].points[0].highlight();
387 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
388  
389 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Find index of current point in series.points array. Necessary for dataGrouping (and maybe zoom?)
390 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curPoints[curPointIndex] !== curPoint) {
391 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { for (var i = 0; i < curPoints.length; ++i) {
392 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curPoints[i] === curPoint) {
393 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPointIndex = i;
394 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { break;
395 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
396 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
397 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
398  
399 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Grab next/prev point & series
400 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries = series[curPoint.series.index + (next ? 1 : -1)];
401 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newPoint = curPoints[curPointIndex + (next ? forwardSkipAmount : -1)] ||
402 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Done with this series, try next one
403 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries &&
404 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries.points[next ? 0 : newSeries.points.length - (
405 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries.connectEnds ? 2 : 1
406 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { )];
407  
408 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // If there is no adjacent point, we return false
409 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newPoint === undefined) {
410 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return false;
411 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
412  
413 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Recursively skip null points
414 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newPoint.isNull && this.options.accessibility.keyboardNavigation &&
415 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.options.accessibility.keyboardNavigation.skipNullPoints) {
416 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedPoint = newPoint;
417 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.highlightAdjacentPoint(next);
418 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
419  
420 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // There is an adjacent point, highlight it
421 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return newPoint.highlight();
422 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
423  
424 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Show the export menu and focus the first item (if exists)
425 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.showExportMenu = function() {
426 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (this.exportSVGElements && this.exportSVGElements[0]) {
427 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.exportSVGElements[0].element.onclick();
428 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightExportItem(0);
429 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
430 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
431  
432 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highlight export menu item by index
433 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.highlightExportItem = function(ix) {
434 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var listItem = this.exportDivElements && this.exportDivElements[ix],
435 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curHighlighted = this.exportDivElements && this.exportDivElements[this.highlightedExportItem];
436  
437 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (listItem && listItem.tagName === 'DIV' && !(listItem.children && listItem.children.length)) {
438 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (listItem.focus) {
439 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { listItem.focus();
440 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
441 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curHighlighted && curHighlighted.onmouseout) {
442 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curHighlighted.onmouseout();
443 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
444 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (listItem.onmouseover) {
445 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { listItem.onmouseover();
446 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
447 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedExportItem = ix;
448 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return true;
449 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
450 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
451  
452 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highlight range selector button by index
453 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.highlightRangeSelectorButton = function(ix) {
454 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var buttons = this.rangeSelector.buttons;
455 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Deselect old
456 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (buttons[this.highlightedRangeSelectorItemIx]) {
457 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { buttons[this.highlightedRangeSelectorItemIx].setState(this.oldRangeSelectorItemState || 0);
458 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
459 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Select new
460 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedRangeSelectorItemIx = ix;
461 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (buttons[ix]) {
462 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (buttons[ix].element.focus) {
463 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { buttons[ix].element.focus();
464 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
465 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.oldRangeSelectorItemState = buttons[ix].state;
466 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { buttons[ix].setState(2);
467 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return true;
468 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
469 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return false;
470 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
471  
472 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highlight legend item by index
473 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.highlightLegendItem = function(ix) {
474 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var items = this.legend.allItems;
475 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (items[this.highlightedLegendItemIx]) {
476 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fireEvent(items[this.highlightedLegendItemIx].legendGroup.element, 'mouseout');
477 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
478 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedLegendItemIx = ix;
479 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (items[ix]) {
480 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (items[ix].legendGroup.element.focus) {
481 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { items[ix].legendGroup.element.focus();
482 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
483 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fireEvent(items[ix].legendGroup.element, 'mouseover');
484 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return true;
485 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
486 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return false;
487 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
488  
489 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Hide export menu
490 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.hideExportMenu = function() {
491 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var exportList = this.exportDivElements;
492 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (exportList) {
493 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(exportList, function(el) {
494 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fireEvent(el, 'mouseleave');
495 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
496 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (exportList[this.highlightedExportItem] && exportList[this.highlightedExportItem].onmouseout) {
497 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportList[this.highlightedExportItem].onmouseout();
498 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
499 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedExportItem = 0;
500 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.renderTo.focus();
501 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
502 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
503  
504 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add keyboard navigation handling to chart
505 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.addKeyboardNavEvents = function() {
506 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var chart = this;
507  
508 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Abstraction layer for keyboard navigation. Keep a map of keyCodes to handler functions, and a next/prev move handler for tab order.
509 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // The module's keyCode handlers determine when to move to another module.
510 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Validate holds a function to determine if there are prerequisites for this module to run that are not met.
511 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Init holds a function to run once before any keyCodes are interpreted.
512 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // transformTabs determines whether to transform tabs to left/right events or not. Defaults to true.
513 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function KeyboardNavigationModule(options) {
514 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.keyCodeMap = options.keyCodeMap;
515 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.move = options.move;
516 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.validate = options.validate;
517 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.init = options.init;
518 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.transformTabs = options.transformTabs !== false;
519 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
520 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { KeyboardNavigationModule.prototype = {
521 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Find handler function(s) for key code in the keyCodeMap and run it.
522 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { run: function(e) {
523 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var navModule = this,
524 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { keyCode = e.which || e.keyCode,
525 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { handled = false;
526 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { keyCode = this.transformTabs && keyCode === 9 ? (e.shiftKey ? 37 : 39) : keyCode; // Transform tabs
527 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(this.keyCodeMap, function(codeSet) {
528 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (codeSet[0].indexOf(keyCode) > -1) {
529 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { handled = codeSet[1].call(navModule, keyCode, e) === false ? false : true; // If explicitly returning false, we haven't handled it
530 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
531 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
532 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return handled;
533 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
534 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
535 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Maintain abstraction between KeyboardNavigationModule and Highcharts
536 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // The chart object keeps track of a list of KeyboardNavigationModules that we move through
537 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function navModuleFactory(keyMap, options) {
538 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return new KeyboardNavigationModule(merge({
539 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { keyCodeMap: keyMap,
540 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Move to next/prev valid module, or undefined if none, and init it.
541 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Returns true on success and false if there is no valid module to move to.
542 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { move: function(direction) {
543 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.keyboardNavigationModuleIndex += direction;
544 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var newModule = chart.keyboardNavigationModules[chart.keyboardNavigationModuleIndex];
545 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newModule) {
546 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newModule.validate && !newModule.validate()) {
547 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(direction); // Invalid module
548 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
549 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newModule.init) {
550 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newModule.init(direction); // Valid module, init it
551 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return true;
552 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
553 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
554 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // No module
555 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.keyboardNavigationModuleIndex = 0; // Reset counter
556 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.slipNextTab = true; // Allow next tab to slip, as we will have focus on chart now
557 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return false;
558 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
559 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }, options));
560 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
561  
562 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Route keydown events
563 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function keydownHandler(ev) {
564 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var e = ev || win.event,
565 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { keyCode = e.which || e.keyCode,
566 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curNavModule = chart.keyboardNavigationModules[chart.keyboardNavigationModuleIndex];
567  
568 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Handle tabbing
569 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (keyCode === 9) {
570 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // If we reached end of chart, we need to let this tab slip through to allow users to tab further
571 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.slipNextTab) {
572 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.slipNextTab = false;
573 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return;
574 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
575 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
576 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // If key was not tab, don't slip the next tab
577 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.slipNextTab = false;
578  
579 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // If there is a navigation module for the current index, run it. Otherwise, we are outside of the chart in some direction.
580 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curNavModule) {
581 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curNavModule.run(e)) {
582 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { e.preventDefault(); // If successfully handled, stop the event here.
583 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
584 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
585 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
586  
587 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // List of the different keyboard handling modes we use depending on where we are in the chart.
588 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Each mode has a set of handling functions mapped to key codes.
589 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Each mode determines when to move to the next/prev mode.
590 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.keyboardNavigationModules = [
591 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Points
592 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory([
593 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Left/Right
594 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
595 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [37, 39],
596 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
597 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!chart.highlightAdjacentPoint(keyCode === 39)) { // Try to highlight adjacent point
598 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(keyCode === 39 ? 1 : -1); // Failed. Move to next/prev module
599 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
600 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
601 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
602 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Up/Down
603 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
604 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [38, 40],
605 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
606 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var newSeries;
607 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightedPoint) {
608 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries = chart.series[chart.highlightedPoint.series.index + (keyCode === 38 ? -1 : 1)]; // Find prev/next series
609 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newSeries && newSeries.points[0]) { // If series exists and has data, go for it
610 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries.points[0].highlight();
611 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { } else {
612 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(keyCode === 40 ? 1 : -1); // Otherwise, attempt to move to next/prev module
613 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
614 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
615 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
616 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
617 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enter/Spacebar
618 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
619 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [13, 32],
620 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
621 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightedPoint) {
622 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightedPoint.firePointEvent('click');
623 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
624 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
625 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
626 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
627 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // If coming back to points from other module, highlight last point
628 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
629 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var lastSeries = chart.series && chart.series[chart.series.length - 1],
630 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { lastPoint = lastSeries && lastSeries.points && lastSeries.points[lastSeries.points.length - 1];
631 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (direction < 0 && lastPoint) {
632 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { lastPoint.highlight();
633 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
634 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
635 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }),
636  
637 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Exporting
638 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory([
639 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Left/Up
640 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
641 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [37, 38],
642 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
643 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var i = chart.highlightedExportItem || 0,
644 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { reachedEnd = true,
645 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { series = chart.series,
646 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries;
647 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Try to highlight prev item in list. Highlighting e.g. separators will fail.
648 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { while (i--) {
649 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightExportItem(i)) {
650 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { reachedEnd = false;
651 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { break;
652 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
653 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
654 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (reachedEnd) {
655 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.hideExportMenu();
656 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Wrap to last point
657 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (series && series.length) {
658 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries = series[series.length - 1];
659 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newSeries.points.length) {
660 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries.points[newSeries.points.length - 1].highlight();
661 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
662 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
663 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Try to move to prev module (should be points, since we wrapped to last point)
664 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(-1);
665 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
666 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
667 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
668 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Right/Down
669 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
670 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [39, 40],
671 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
672 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var highlightedExportItem = chart.highlightedExportItem || 0,
673 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { reachedEnd = true;
674 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Try to highlight next item in list. Highlighting e.g. separators will fail.
675 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { for (var i = highlightedExportItem + 1; i < chart.exportDivElements.length; ++i) {
676 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightExportItem(i)) {
677 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { reachedEnd = false;
678 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { break;
679 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
680 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
681 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (reachedEnd) {
682 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.hideExportMenu();
683 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(1); // Next module
684 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
685 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
686 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
687 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enter/Spacebar
688 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
689 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [13, 32],
690 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
691 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fakeClickEvent(chart.exportDivElements[chart.highlightedExportItem]);
692 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
693 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
694 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
695 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Only run exporting navigation if exporting support exists and is enabled on chart
696 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
697 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return chart.exportChart && !(chart.options.exporting && chart.options.exporting.enabled === false);
698 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
699 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Show export menu
700 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
701 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightedPoint = null;
702 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.showExportMenu();
703 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // If coming back to export menu from other module, try to highlight last item in menu
704 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (direction < 0 && chart.exportDivElements) {
705 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { for (var i = chart.exportDivElements.length; i > -1; --i) {
706 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightExportItem(i)) {
707 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { break;
708 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
709 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
710 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
711 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
712 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }),
713  
714 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Map zoom
715 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory([
716 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Up/down/left/right
717 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
718 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [38, 40, 37, 39],
719 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
720 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart[keyCode === 38 || keyCode === 40 ? 'yAxis' : 'xAxis'][0].panStep(keyCode < 39 ? -1 : 1);
721 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
722 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
723  
724 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Tabs
725 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
726 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [9],
727 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode, e) {
728 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var button;
729 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.mapNavButtons[chart.focusedMapNavButtonIx].setState(0); // Deselect old
730 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (e.shiftKey && !chart.focusedMapNavButtonIx || !e.shiftKey && chart.focusedMapNavButtonIx) { // trying to go somewhere we can't?
731 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.mapZoom(); // Reset zoom
732 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(e.shiftKey ? -1 : 1); // Nowhere to go, go to prev/next module
733 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
734 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.focusedMapNavButtonIx += e.shiftKey ? -1 : 1;
735 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button = chart.mapNavButtons[chart.focusedMapNavButtonIx];
736 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (button.element.focus) {
737 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.focus();
738 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
739 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.setState(2);
740 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
741 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
742  
743 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enter/Spacebar
744 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
745 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [13, 32],
746 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
747 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fakeClickEvent(chart.mapNavButtons[chart.focusedMapNavButtonIx].element);
748 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
749 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
750 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
751 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Only run this module if we have map zoom on the chart
752 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
753 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return chart.mapZoom && chart.mapNavButtons && chart.mapNavButtons.length === 2;
754 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
755  
756 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Handle tabs separately
757 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { transformTabs: false,
758  
759 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make zoom buttons do their magic
760 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
761 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var zoomIn = chart.mapNavButtons[0],
762 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { zoomOut = chart.mapNavButtons[1],
763 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { initialButton = direction > 0 ? zoomIn : zoomOut;
764  
765 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(chart.mapNavButtons, function(button, i) {
766 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('tabindex', -1);
767 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('role', 'button');
768 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('aria-label', 'Zoom ' + (i ? 'out' : '') + 'chart');
769 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
770  
771 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (initialButton.element.focus) {
772 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { initialButton.element.focus();
773 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
774 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { initialButton.setState(2);
775 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.focusedMapNavButtonIx = direction > 0 ? 0 : 1;
776 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
777 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }),
778  
779 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highstock range selector (minus input boxes)
780 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory([
781 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Left/Right/Up/Down
782 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
783 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [37, 39, 38, 40],
784 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
785 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var direction = (keyCode === 37 || keyCode === 38) ? -1 : 1;
786 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Try to highlight next/prev button
787 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!chart.highlightRangeSelectorButton(chart.highlightedRangeSelectorItemIx + direction)) {
788 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(direction);
789 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
790 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
791 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
792 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enter/Spacebar
793 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
794 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [13, 32],
795 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
796 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.oldRangeSelectorItemState !== 3) { // Don't allow click if button used to be disabled
797 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fakeClickEvent(chart.rangeSelector.buttons[chart.highlightedRangeSelectorItemIx].element);
798 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
799 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
800 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
801 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
802 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Only run this module if we have range selector
803 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
804 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return chart.rangeSelector && chart.rangeSelector.buttons && chart.rangeSelector.buttons.length;
805 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
806  
807 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make elements focusable and accessible
808 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
809 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(chart.rangeSelector.buttons, function(button) {
810 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('tabindex', '-1');
811 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('role', 'button');
812 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('aria-label', 'Select range ' + (button.text && button.text.textStr));
813 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
814 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Focus first/last button
815 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightRangeSelectorButton(direction > 0 ? 0 : chart.rangeSelector.buttons.length - 1);
816 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
817 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }),
818  
819 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highstock range selector, input boxes
820 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory([
821 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Tab/Up/Down
822 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
823 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [9, 38, 40],
824 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode, e) {
825 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var direction = (keyCode === 9 && e.shiftKey || keyCode === 38) ? -1 : 1,
826 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newIx = chart.highlightedInputRangeIx = chart.highlightedInputRangeIx + direction;
827 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Try to highlight next/prev item in list.
828 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newIx > 1 || newIx < 0) { // Out of range
829 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(direction);
830 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
831 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.rangeSelector[newIx ? 'maxInput' : 'minInput'].focus(); // Input boxes are HTML, and should have focus support in all browsers
832 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
833 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
834 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
835 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Only run if we have range selector with input boxes
836 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
837 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var inputVisible = chart.rangeSelector && chart.rangeSelector.inputGroup && chart.rangeSelector.inputGroup.element.getAttribute('visibility') !== 'hidden';
838 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return inputVisible && chart.options.rangeSelector.inputEnabled !== false && chart.rangeSelector.minInput && chart.rangeSelector.maxInput;
839 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
840  
841 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Handle tabs different from left/right (because we don't want to catch left/right in a text area)
842 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { transformTabs: false,
843  
844 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highlight first/last input box
845 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
846 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightedInputRangeIx = direction > 0 ? 0 : 1;
847 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.rangeSelector[chart.highlightedInputRangeIx ? 'maxInput' : 'minInput'].focus();
848 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
849 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }),
850  
851 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Legend navigation
852 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory([
853 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Left/Right/Up/Down
854 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
855 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [37, 39, 38, 40],
856 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
857 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var direction = (keyCode === 37 || keyCode === 38) ? -1 : 1;
858 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Try to highlight next/prev legend item
859 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!chart.highlightLegendItem(chart.highlightedLegendItemIx + direction)) {
860 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(direction);
861 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
862 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
863 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
864 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enter/Spacebar
865 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
866 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [13, 32],
867 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
868 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fakeClickEvent(chart.legend.allItems[chart.highlightedLegendItemIx].legendItem.element.parentNode);
869 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
870 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
871 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
872 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Only run this module if we have at least one legend - wait for it - item.
873 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
874 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return chart.legend && chart.legend.allItems && !chart.colorAxis;
875 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
876  
877 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make elements focusable and accessible
878 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
879 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(chart.legend.allItems, function(item) {
880 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { item.legendGroup.element.setAttribute('tabindex', '-1');
881 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { item.legendGroup.element.setAttribute('role', 'button');
882 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { item.legendGroup.element.setAttribute('aria-label', 'Toggle visibility of series ' + item.name);
883 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
884 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Focus first/last item
885 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightLegendItem(direction > 0 ? 0 : chart.legend.allItems.length - 1);
886 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
887 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { })
888 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ];
889  
890 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Init nav module index. We start at the first module, and as the user navigates through the chart the index will increase to use different handler modules.
891 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.keyboardNavigationModuleIndex = 0;
892  
893 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make chart reachable by tab
894 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (
895 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.container.hasAttribute &&
896 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { !chart.container.hasAttribute('tabIndex')
897 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ) {
898 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.container.setAttribute('tabindex', '0');
899 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
900  
901 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Handle keyboard events
902 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { addEvent(chart.renderTo, 'keydown', keydownHandler);
903 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { addEvent(chart, 'destroy', function() {
904 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { removeEvent(chart.renderTo, 'keydown', keydownHandler);
905 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
906 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
907  
908 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add screen reader region to chart.
909 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // tableId is the HTML id of the table to focus when clicking the table anchor in the screen reader region.
910 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.addScreenReaderRegion = function(id, tableId) {
911 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var chart = this,
912 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { series = chart.series,
913 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { options = chart.options,
914 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { a11yOptions = options.accessibility,
915 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection = chart.screenReaderRegion = doc.createElement('div'),
916 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcut = doc.createElement('h4'),
917 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcutAnchor = doc.createElement('a'),
918 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chartHeading = doc.createElement('h4'),
919 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenStyle = { // CSS style to hide element from visual users while still exposing it to screen readers
920 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { position: 'absolute',
921 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { left: '-9999px',
922 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { top: 'auto',
923 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { width: '1px',
924 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { height: '1px',
925 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { overflow: 'hidden'
926 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
927 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chartTypes = chart.types || [],
928 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Build axis info - but not for pies and maps. Consider not adding for certain other types as well (funnel, pyramid?)
929 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { axesDesc = (chartTypes.length === 1 && chartTypes[0] === 'pie' || chartTypes[0] === 'map') && {} || chart.getAxesDescription(),
930 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chartTypeInfo = series[0] && typeToSeriesMap[series[0].type] || typeToSeriesMap['default']; // eslint-disable-line dot-notation
931  
932 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.setAttribute('id', id);
933 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.setAttribute('role', 'region');
934 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.setAttribute('aria-label', 'Chart screen reader information.');
935  
936 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.innerHTML = a11yOptions.screenReaderSectionFormatter && a11yOptions.screenReaderSectionFormatter(chart) ||
937 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { '<div>Use regions/landmarks to skip ahead to chart' +
938 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (series.length > 1 ? ' and navigate between data series' : '') +
939 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { '.</div><h3>' + (options.title.text ? htmlencode(options.title.text) : 'Chart') +
940 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (options.subtitle && options.subtitle.text ? '. ' + htmlencode(options.subtitle.text) : '') +
941 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { '</h3><h4>Long description.</h4><div>' + (options.chart.description || 'No description available.') +
942 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { '</div><h4>Structure.</h4><div>Chart type: ' + (options.chart.typeDescription || chart.getTypeDescription()) + '</div>' +
943 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (series.length === 1 ? '<div>' + chartTypeInfo[0] + ' with ' + series[0].points.length + ' ' +
944 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (series[0].points.length === 1 ? chartTypeInfo[1] : chartTypeInfo[2]) + '.</div>' : '') +
945 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (axesDesc.xAxis ? ('<div>' + axesDesc.xAxis + '</div>') : '') +
946 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (axesDesc.yAxis ? ('<div>' + axesDesc.yAxis + '</div>') : '');
947  
948 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add shortcut to data table if export-csv is loaded
949 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.getCSV) {
950 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcutAnchor.innerHTML = 'View as data table.';
951 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcutAnchor.href = '#' + tableId;
952 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcutAnchor.setAttribute('tabindex', '-1'); // Make this unreachable by user tabbing
953 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcutAnchor.onclick = a11yOptions.onTableAnchorClick || function() {
954 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.viewData();
955 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { doc.getElementById(tableId).focus();
956 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
957 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcut.appendChild(tableShortcutAnchor);
958 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.appendChild(tableShortcut);
959 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
960  
961 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Note: JAWS seems to refuse to read aria-label on the container, so add an
962 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // h4 element as title for the chart.
963 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chartHeading.innerHTML = 'Chart graphic.';
964 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.renderTo.insertBefore(chartHeading, chart.renderTo.firstChild);
965 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.renderTo.insertBefore(hiddenSection, chart.renderTo.firstChild);
966  
967 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Hide the section and the chart heading
968 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { merge(true, chartHeading.style, hiddenStyle);
969 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { merge(true, hiddenSection.style, hiddenStyle);
970 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
971  
972  
973 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make chart container accessible, and wrap table functionality
974 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.callbacks.push(function(chart) {
975 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var options = chart.options,
976 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { a11yOptions = options.accessibility;
977  
978 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!a11yOptions.enabled) {
979 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return;
980 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
981  
982 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var titleElement = doc.createElementNS('http://www.w3.org/2000/svg', 'title'),
983 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportGroupElement = doc.createElementNS('http://www.w3.org/2000/svg', 'g'),
984 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { descElement = chart.container.getElementsByTagName('desc')[0],
985 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { textElements = chart.container.getElementsByTagName('text'),
986 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { titleId = 'highcharts-title-' + chart.index,
987 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableId = 'highcharts-data-table-' + chart.index,
988 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSectionId = 'highcharts-information-region-' + chart.index,
989 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chartTitle = options.title.text || 'Chart',
990 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { oldColumnHeaderFormatter = options.exporting && options.exporting.csv && options.exporting.csv.columnHeaderFormatter,
991 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { topLevelColumns = [];
992  
993 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add SVG title/desc tags
994 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { titleElement.textContent = htmlencode(chartTitle);
995 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { titleElement.id = titleId;
996 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { descElement.parentNode.insertBefore(titleElement, descElement);
997 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.renderTo.setAttribute('role', 'region');
998 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.container.setAttribute('aria-details', hiddenSectionId);
999 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.renderTo.setAttribute('aria-label', 'Interactive chart. ' + chartTitle +
1000 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { '. Use up and down arrows to navigate with most screen readers.');
1001  
1002 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set screen reader properties on export menu
1003 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.exportSVGElements && chart.exportSVGElements[0] && chart.exportSVGElements[0].element) {
1004 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var oldExportCallback = chart.exportSVGElements[0].element.onclick,
1005 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { parent = chart.exportSVGElements[0].element.parentNode;
1006 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.exportSVGElements[0].element.onclick = function() {
1007 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { oldExportCallback.apply(this, Array.prototype.slice.call(arguments));
1008 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.addAccessibleContextMenuAttribs();
1009 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightExportItem(0);
1010 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
1011 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.exportSVGElements[0].element.setAttribute('role', 'button');
1012 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.exportSVGElements[0].element.setAttribute('aria-label', 'View export menu');
1013 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportGroupElement.appendChild(chart.exportSVGElements[0].element);
1014 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportGroupElement.setAttribute('role', 'region');
1015 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportGroupElement.setAttribute('aria-label', 'Chart export menu');
1016 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { parent.appendChild(exportGroupElement);
1017 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1018  
1019 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set screen reader properties on input boxes for range selector. We need to do this regardless of whether or not these are visible, as they are
1020 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // by default part of the page's tabindex unless we set them to -1.
1021 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.rangeSelector) {
1022 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(['minInput', 'maxInput'], function(key, i) {
1023 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.rangeSelector[key]) {
1024 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.rangeSelector[key].setAttribute('tabindex', '-1');
1025 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.rangeSelector[key].setAttribute('role', 'textbox');
1026 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.rangeSelector[key].setAttribute('aria-label', 'Select ' + (i ? 'end' : 'start') + ' date.');
1027 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1028 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1029 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1030  
1031 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Hide text elements from screen readers
1032 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(textElements, function(el) {
1033 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { el.setAttribute('aria-hidden', 'true');
1034 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1035  
1036 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add top-secret screen reader region
1037 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.addScreenReaderRegion(hiddenSectionId, tableId);
1038  
1039 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enable keyboard navigation
1040 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (a11yOptions.keyboardNavigation) {
1041 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.addKeyboardNavEvents();
1042 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1043  
1044 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { /* Wrap table functionality from export-csv */
1045  
1046 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Keep track of columns
1047 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { merge(true, options.exporting, {
1048 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { csv: {
1049 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { columnHeaderFormatter: function(series, key, keyLength) {
1050 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var prevCol = topLevelColumns[topLevelColumns.length - 1];
1051 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (keyLength > 1) {
1052 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // We need multiple levels of column headers
1053 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Populate a list of column headers to add in addition to the ones added by export-csv
1054 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if ((prevCol && prevCol.text) !== series.name) {
1055 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { topLevelColumns.push({
1056 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { text: series.name,
1057 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { span: keyLength
1058 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1059 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1060 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1061 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (oldColumnHeaderFormatter) {
1062 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return oldColumnHeaderFormatter.call(this, series, key, keyLength);
1063 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1064 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return keyLength > 1 ? key : series.name;
1065 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1066 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1067 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1068  
1069 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add ID and title/caption to table HTML
1070 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.wrap(chart, 'getTable', function(proceed) {
1071 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return proceed.apply(this, Array.prototype.slice.call(arguments, 1))
1072 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { .replace('<table>', '<table id="' + tableId + '" summary="Table representation of chart"><caption>' + chartTitle + '</caption>');
1073 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1074  
1075 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add accessibility attributes and top level columns
1076 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.wrap(chart, 'viewData', function(proceed) {
1077 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!this.insertedTable) {
1078 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { proceed.apply(this, Array.prototype.slice.call(arguments, 1));
1079  
1080 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var table = doc.getElementById(tableId),
1081 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { body = table.getElementsByTagName('tbody')[0],
1082 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { firstRow = body.firstChild.children,
1083 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { columnHeaderRow = '<tr><td></td>',
1084 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { cell,
1085 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newCell;
1086  
1087 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make table focusable by script
1088 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { table.setAttribute('tabindex', '-1');
1089  
1090 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Create row headers
1091 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(body.children, function(el) {
1092 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { cell = el.firstChild;
1093 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newCell = doc.createElement('th');
1094 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newCell.setAttribute('scope', 'row');
1095 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newCell.innerHTML = cell.innerHTML;
1096 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { cell.parentNode.replaceChild(newCell, cell);
1097 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1098  
1099 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set scope for column headers
1100 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(firstRow, function(el) {
1101 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (el.tagName === 'TH') {
1102 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { el.setAttribute('scope', 'col');
1103 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1104 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1105  
1106 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add top level columns
1107 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (topLevelColumns.length) {
1108 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(topLevelColumns, function(col) {
1109 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { columnHeaderRow += '<th scope="col" colspan="' + col.span + '">' + col.text + '</th>';
1110 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1111 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { body.insertAdjacentHTML('afterbegin', columnHeaderRow);
1112 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1113 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1114 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1115 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1116  
1117 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }(Highcharts));
1118 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) {}));