corrade-nucleus-nucleons – Blame information for rev 20

Subversion Repositories:
Rev:
Rev Author Line No. Line
20 office 1 /**
2 * @license Highcharts JS v5.0.12 (2017-05-24)
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',
162 point.series.options.pointDescriptionFormatter &&
163 point.series.options.pointDescriptionFormatter(point) ||
164 a11yOptions.pointDescriptionFormatter &&
165 a11yOptions.pointDescriptionFormatter(point) ||
166 point.buildPointInfoString());
167 }
168 });
169 }
170 // Make series element accessible
171 if (this.chart.series.length > 1 || a11yOptions.describeSingleSeries) {
172 seriesEl.setAttribute(
173 'role',
174 this.options.exposeElementToA11y ? 'img' : 'region'
175 );
176 seriesEl.setAttribute('tabindex', '-1');
177 seriesEl.setAttribute('aria-label', a11yOptions.seriesDescriptionFormatter && a11yOptions.seriesDescriptionFormatter(this) ||
178 this.buildSeriesInfoString());
179 }
180 }
181 };
182  
183 // Return string with information about series
184 H.Series.prototype.buildSeriesInfoString = function() {
185 var typeInfo = typeToSeriesMap[this.type] || typeToSeriesMap['default'], // eslint-disable-line dot-notation
186 description = this.description || this.options.description;
187 return (this.name ? this.name + ', ' : '') +
188 (this.chart.types.length === 1 ? typeInfo[0] : 'series') + ' ' + (this.index + 1) + ' of ' + (this.chart.series.length) +
189 (this.chart.types.length === 1 ? ' with ' : '. ' + typeInfo[0] + ' with ') +
190 (this.points.length + ' ' + (this.points.length === 1 ? typeInfo[1] : typeInfo[2])) +
191 (description ? '. ' + description : '') +
192 (this.chart.yAxis.length > 1 && this.yAxis ? '. Y axis, ' + this.yAxis.getDescription() : '') +
193 (this.chart.xAxis.length > 1 && this.xAxis ? '. X axis, ' + this.xAxis.getDescription() : '');
194 };
195  
196 // Return string with information about point
197 H.Point.prototype.buildPointInfoString = function() {
198 var point = this,
199 series = point.series,
200 a11yOptions = series.chart.options.accessibility,
201 infoString = '',
202 dateTimePoint = series.xAxis && series.xAxis.isDatetimeAxis,
203 timeDesc = dateTimePoint && dateFormat(a11yOptions.pointDateFormatter && a11yOptions.pointDateFormatter(point) || a11yOptions.pointDateFormat ||
204 H.Tooltip.prototype.getXDateFormat(point, series.chart.options.tooltip, series.xAxis), point.x),
205 hasSpecialKey = H.find(series.specialKeys, function(key) {
206 return point[key] !== undefined;
207 });
208  
209 // If the point has one of the less common properties defined, display all that are defined
210 if (hasSpecialKey) {
211 if (dateTimePoint) {
212 infoString = timeDesc;
213 }
214 each(series.commonKeys.concat(series.specialKeys), function(key) {
215 if (point[key] !== undefined && !(dateTimePoint && key === 'x')) {
216 infoString += (infoString ? '. ' : '') + key + ', ' + point[key];
217 }
218 });
219 } else {
220 // Pick and choose properties for a succint label
221 infoString = (this.name || timeDesc || this.category || this.id || 'x, ' + this.x) + ', ' +
222 (this.value !== undefined ? this.value : this.y);
223 }
224  
225 return (this.index + 1) + '. ' + infoString + '.' + (this.description ? ' ' + this.description : '');
226 };
227  
228 // Get descriptive label for axis
229 H.Axis.prototype.getDescription = function() {
230 return this.userOptions && this.userOptions.description || this.axisTitle && this.axisTitle.textStr ||
231 this.options.id || this.categories && 'categories' || 'values';
232 };
233  
234 // Pan along axis in a direction (1 or -1), optionally with a defined granularity (number of steps it takes to walk across current view)
235 H.Axis.prototype.panStep = function(direction, granularity) {
236 var gran = granularity || 3,
237 extremes = this.getExtremes(),
238 step = (extremes.max - extremes.min) / gran * direction,
239 newMax = extremes.max + step,
240 newMin = extremes.min + step,
241 size = newMax - newMin;
242 if (direction < 0 && newMin < extremes.dataMin) {
243 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { newMin = extremes.dataMin;
244 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { newMax = newMin + size;
245 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { } else if (direction > 0 && newMax > extremes.dataMax) {
246 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { newMax = extremes.dataMax;
247 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { newMin = newMax - size;
248 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { }
249 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { this.setExtremes(newMin, newMax);
250 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { };
251  
252 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { // Whenever adding or removing series, keep track of types present in chart
253 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { H.wrap(H.Series.prototype, 'init', function(proceed) {
254 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { proceed.apply(this, Array.prototype.slice.call(arguments, 1));
255 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { var chart = this.chart;
256 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { if (chart.options.accessibility.enabled) {
257 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { chart.types = chart.types || [];
258  
259 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { // Add type to list if does not exist
260 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { if (chart.types.indexOf(this.type) < 0) {
261 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { chart.types.push(this.type);
262 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { }
263  
264 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { addEvent(this, 'remove', function() {
265 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { var removedSeries = this,
266 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { hasType = false;
267  
268 < 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.
269 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { each(chart.series, function(s) {
270 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { if (s !== removedSeries && chart.types.indexOf(removedSeries.type) < 0) {
271 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { hasType = true;
272 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { }
273 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { });
274 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { if (!hasType) {
275 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { erase(chart.types, removedSeries.type);
276 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { }
277 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { });
278 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { }
279 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { });
280  
281 < 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.
282 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { H.Chart.prototype.getTypeDescription = function() {
283 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { var firstType = this.types && this.types[0],
284 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { mapTitle = this.series[0] && this.series[0].mapTitle;
285 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { if (!firstType) {
286 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return 'Empty chart.';
287 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { } else if (firstType === 'map') {
288 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return mapTitle ? 'Map of ' + mapTitle : 'Map of unspecified region.';
289 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { } else if (this.types.length > 1) {
290 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return 'Combination chart.';
291 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { } else if (['spline', 'area', 'areaspline'].indexOf(firstType) > -1) {
292 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return 'Line chart.';
293 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { }
294 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return firstType + ' chart.' + (typeDescriptionMap[firstType] || '');
295 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { };
296  
297 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { // Return object with text description of each of the chart's axes
298 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { H.Chart.prototype.getAxesDescription = function() {
299 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { var numXAxes = this.xAxis.length,
300 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { numYAxes = this.yAxis.length,
301 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { desc = {},
302 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { i;
303  
304 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { if (numXAxes) {
305 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { desc.xAxis = 'The chart has ' + numXAxes + (numXAxes > 1 ? ' X axes' : ' X axis') + ' displaying ';
306 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { if (numXAxes < 2) {
307 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) { desc.xAxis += this.xAxis[0].getDescription() + '.';
308 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) { } else {
309 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) { for (i = 0; i < numXAxes - 1; ++i) {
310 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { desc.xAxis += (i ? ', ' : '') + this.xAxis[i].getDescription();
311 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { }
312 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { desc.xAxis += ' and ' + this.xAxis[i].getDescription() + '.';
313 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { }
314 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { }
315  
316 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { if (numYAxes) {
317 < 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 ';
318 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { if (numYAxes < 2) {
319 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) { desc.yAxis += this.yAxis[0].getDescription() + '.';
320 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) { } else {
321 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) { for (i = 0; i < numYAxes - 1; ++i) {
322 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { desc.yAxis += (i ? ', ' : '') + this.yAxis[i].getDescription();
323 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
324 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { desc.yAxis += ' and ' + this.yAxis[i].getDescription() + '.';
325 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
326 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
327  
328 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return desc;
329 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
330  
331 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set a11y attribs on exporting menu
332 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.addAccessibleContextMenuAttribs = function() {
333 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var exportList = this.exportDivElements;
334 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (exportList) {
335 < 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
336 < 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
337 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(exportList, function(item) {
338 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (item.tagName === 'DIV' &&
339 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { !(item.children && item.children.length)) {
340 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { item.setAttribute('role', 'menuitem');
341 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { item.setAttribute('tabindex', -1);
342 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
343 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
344 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set accessibility properties on parent div
345 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportList[0].parentNode.setAttribute('role', 'menu');
346 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportList[0].parentNode.setAttribute('aria-label', 'Chart export');
347 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
348 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
349  
350 < 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.
351 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Point.prototype.highlight = function() {
352 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var chart = this.series.chart;
353 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (this.graphic && this.graphic.element.focus) {
354 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.graphic.element.focus();
355 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
356 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!this.isNull) {
357 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.onMouseOver(); // Show the hover marker
358 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Show the tooltip
359 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.tooltip) {
360 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.tooltip.refresh(chart.tooltip.shared ? [this] : this);
361 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
362 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { } else {
363 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.tooltip) {
364 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.tooltip.hide(0);
365 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
366 < 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
367 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
368 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightedPoint = this;
369 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this;
370 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
371  
372 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Function to highlight next/previous point in chart
373 < 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)
374 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.highlightAdjacentPoint = function(next) {
375 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var series = this.series,
376 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPoint = this.highlightedPoint,
377 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPointIndex = curPoint && curPoint.index || 0,
378 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPoints = curPoint && curPoint.series.points,
379 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries,
380 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newPoint,
381 < 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
382 < 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.
383 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { forwardSkipAmount = curPoint && curPoint.series.connectEnds &&
384 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPointIndex > curPoints.length - 3 ? 2 : 1;
385  
386 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // If no points, return false
387 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!series[0] || !series[0].points) {
388 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return false;
389 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
390  
391 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Use first point if none already highlighted
392 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!curPoint) {
393 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return series[0].points[0].highlight();
394 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
395  
396 < 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?)
397 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curPoints[curPointIndex] !== curPoint) {
398 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { for (var i = 0; i < curPoints.length; ++i) {
399 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curPoints[i] === curPoint) {
400 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPointIndex = i;
401 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { break;
402 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
403 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
404 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
405  
406 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Grab next/prev point & series
407 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries = series[curPoint.series.index + (next ? 1 : -1)];
408 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newPoint = curPoints[curPointIndex + (next ? forwardSkipAmount : -1)] ||
409 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Done with this series, try next one
410 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries &&
411 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries.points[next ? 0 : newSeries.points.length - (
412 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries.connectEnds ? 2 : 1
413 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { )];
414  
415 < 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
416 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newPoint === undefined) {
417 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return false;
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) { // Recursively skip null points or points in series that should be skipped
421 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (
422 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newPoint.isNull &&
423 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.options.accessibility.keyboardNavigation.skipNullPoints ||
424 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newPoint.series.options.skipKeyboardNavigation
425 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ) {
426 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedPoint = newPoint;
427 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.highlightAdjacentPoint(next);
428 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
429  
430 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // There is an adjacent point, highlight it
431 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return newPoint.highlight();
432 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
433  
434 < 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)
435 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.showExportMenu = function() {
436 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (this.exportSVGElements && this.exportSVGElements[0]) {
437 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.exportSVGElements[0].element.onclick();
438 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightExportItem(0);
439 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
440 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
441  
442 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highlight export menu item by index
443 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.highlightExportItem = function(ix) {
444 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var listItem = this.exportDivElements && this.exportDivElements[ix],
445 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curHighlighted = this.exportDivElements && this.exportDivElements[this.highlightedExportItem];
446  
447 < 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)) {
448 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (listItem.focus) {
449 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { listItem.focus();
450 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
451 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curHighlighted && curHighlighted.onmouseout) {
452 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curHighlighted.onmouseout();
453 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
454 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (listItem.onmouseover) {
455 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { listItem.onmouseover();
456 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
457 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedExportItem = ix;
458 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return true;
459 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
460 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
461  
462 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highlight range selector button by index
463 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.highlightRangeSelectorButton = function(ix) {
464 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var buttons = this.rangeSelector.buttons;
465 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Deselect old
466 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (buttons[this.highlightedRangeSelectorItemIx]) {
467 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { buttons[this.highlightedRangeSelectorItemIx].setState(this.oldRangeSelectorItemState || 0);
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) { // Select new
470 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedRangeSelectorItemIx = ix;
471 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (buttons[ix]) {
472 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (buttons[ix].element.focus) {
473 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { buttons[ix].element.focus();
474 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
475 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.oldRangeSelectorItemState = buttons[ix].state;
476 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { buttons[ix].setState(2);
477 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return true;
478 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
479 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return false;
480 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
481  
482 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highlight legend item by index
483 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.highlightLegendItem = function(ix) {
484 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var items = this.legend.allItems;
485 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (items[this.highlightedLegendItemIx]) {
486 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fireEvent(items[this.highlightedLegendItemIx].legendGroup.element, 'mouseout');
487 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
488 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedLegendItemIx = ix;
489 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (items[ix]) {
490 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (items[ix].legendGroup.element.focus) {
491 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { items[ix].legendGroup.element.focus();
492 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
493 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fireEvent(items[ix].legendGroup.element, 'mouseover');
494 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return true;
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) { return false;
497 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
498  
499 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Hide export menu
500 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.hideExportMenu = function() {
501 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var exportList = this.exportDivElements;
502 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (exportList) {
503 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(exportList, function(el) {
504 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fireEvent(el, 'mouseleave');
505 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
506 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (exportList[this.highlightedExportItem] && exportList[this.highlightedExportItem].onmouseout) {
507 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportList[this.highlightedExportItem].onmouseout();
508 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
509 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedExportItem = 0;
510 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.renderTo.focus();
511 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
512 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
513  
514 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add keyboard navigation handling to chart
515 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.addKeyboardNavEvents = function() {
516 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var chart = this;
517  
518 < 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.
519 < 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.
520 < 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.
521 < 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.
522 < 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.
523 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function KeyboardNavigationModule(options) {
524 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.keyCodeMap = options.keyCodeMap;
525 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.move = options.move;
526 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.validate = options.validate;
527 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.init = options.init;
528 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.transformTabs = options.transformTabs !== false;
529 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
530 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { KeyboardNavigationModule.prototype = {
531 < 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.
532 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { run: function(e) {
533 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var navModule = this,
534 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { keyCode = e.which || e.keyCode,
535 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { handled = false;
536 < 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
537 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(this.keyCodeMap, function(codeSet) {
538 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (codeSet[0].indexOf(keyCode) > -1) {
539 < 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
540 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
541 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
542 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return handled;
543 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
544 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
545 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Maintain abstraction between KeyboardNavigationModule and Highcharts
546 < 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
547 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function navModuleFactory(keyMap, options) {
548 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return new KeyboardNavigationModule(merge({
549 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { keyCodeMap: keyMap,
550 < 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.
551 < 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.
552 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { move: function(direction) {
553 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.keyboardNavigationModuleIndex += direction;
554 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var newModule = chart.keyboardNavigationModules[chart.keyboardNavigationModuleIndex];
555 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newModule) {
556 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newModule.validate && !newModule.validate()) {
557 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(direction); // Invalid module
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) { if (newModule.init) {
560 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newModule.init(direction); // Valid module, init it
561 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return true;
562 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
563 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
564 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // No module
565 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.keyboardNavigationModuleIndex = 0; // Reset counter
566 < 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
567 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return false;
568 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
569 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }, options));
570 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
571  
572 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Route keydown events
573 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function keydownHandler(ev) {
574 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var e = ev || win.event,
575 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { keyCode = e.which || e.keyCode,
576 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curNavModule = chart.keyboardNavigationModules[chart.keyboardNavigationModuleIndex];
577  
578 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Handle tabbing
579 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (keyCode === 9) {
580 < 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
581 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.slipNextTab) {
582 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.slipNextTab = false;
583 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return;
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 < 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
587 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.slipNextTab = false;
588  
589 < 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.
590 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curNavModule) {
591 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curNavModule.run(e)) {
592 < 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.
593 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
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) { }
596  
597 < 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.
598 < 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.
599 < 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.
600 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.keyboardNavigationModules = [
601 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Points
602 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory([
603 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Left/Right
604 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
605 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [37, 39],
606 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
607 < 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
608 < 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
609 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
610 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
611 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
612 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Up/Down
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) { [38, 40],
615 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
616 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var newSeries;
617 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightedPoint) {
618 < 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
619 < 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
620 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries.points[0].highlight();
621 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { } else {
622 < 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
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) { // Enter/Spacebar
628 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
629 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [13, 32],
630 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
631 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightedPoint) {
632 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightedPoint.firePointEvent('click');
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 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
637 < 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
638 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
639 < 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],
640 < 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];
641 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (direction < 0 && lastPoint) {
642 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { lastPoint.highlight();
643 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
644 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
645 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }),
646  
647 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Exporting
648 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory([
649 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Left/Up
650 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
651 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [37, 38],
652 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
653 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var i = chart.highlightedExportItem || 0,
654 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { reachedEnd = true,
655 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { series = chart.series,
656 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries;
657 < 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.
658 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { while (i--) {
659 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightExportItem(i)) {
660 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { reachedEnd = false;
661 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { break;
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) { }
664 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (reachedEnd) {
665 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.hideExportMenu();
666 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Wrap to last point
667 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (series && series.length) {
668 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries = series[series.length - 1];
669 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newSeries.points.length) {
670 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries.points[newSeries.points.length - 1].highlight();
671 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
672 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
673 < 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)
674 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(-1);
675 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
676 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
677 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
678 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Right/Down
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) { [39, 40],
681 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
682 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var highlightedExportItem = chart.highlightedExportItem || 0,
683 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { reachedEnd = true;
684 < 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.
685 < 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) {
686 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightExportItem(i)) {
687 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { reachedEnd = false;
688 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { break;
689 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
690 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
691 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (reachedEnd) {
692 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.hideExportMenu();
693 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(1); // Next module
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) { }
696 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
697 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enter/Spacebar
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) { [13, 32],
700 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
701 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fakeClickEvent(chart.exportDivElements[chart.highlightedExportItem]);
702 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
703 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
704 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
705 < 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
706 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
707 < 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);
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) { // Show export menu
710 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
711 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightedPoint = null;
712 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.showExportMenu();
713 < 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
714 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (direction < 0 && chart.exportDivElements) {
715 < 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) {
716 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightExportItem(i)) {
717 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { break;
718 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
719 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
720 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
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) { // Map zoom
725 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory([
726 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Up/down/left/right
727 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
728 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [38, 40, 37, 39],
729 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
730 < 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);
731 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
732 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
733  
734 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Tabs
735 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
736 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [9],
737 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode, e) {
738 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var button;
739 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.mapNavButtons[chart.focusedMapNavButtonIx].setState(0); // Deselect old
740 < 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?
741 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.mapZoom(); // Reset zoom
742 < 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
743 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
744 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.focusedMapNavButtonIx += e.shiftKey ? -1 : 1;
745 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button = chart.mapNavButtons[chart.focusedMapNavButtonIx];
746 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (button.element.focus) {
747 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.focus();
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) { button.setState(2);
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) { ],
752  
753 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enter/Spacebar
754 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
755 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [13, 32],
756 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
757 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fakeClickEvent(chart.mapNavButtons[chart.focusedMapNavButtonIx].element);
758 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
759 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
760 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
761 < 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
762 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
763 < 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;
764 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
765  
766 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Handle tabs separately
767 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { transformTabs: false,
768  
769 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make zoom buttons do their magic
770 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
771 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var zoomIn = chart.mapNavButtons[0],
772 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { zoomOut = chart.mapNavButtons[1],
773 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { initialButton = direction > 0 ? zoomIn : zoomOut;
774  
775 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(chart.mapNavButtons, function(button, i) {
776 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('tabindex', -1);
777 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('role', 'button');
778 < 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');
779 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
780  
781 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (initialButton.element.focus) {
782 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { initialButton.element.focus();
783 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
784 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { initialButton.setState(2);
785 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.focusedMapNavButtonIx = direction > 0 ? 0 : 1;
786 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
787 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }),
788  
789 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highstock range selector (minus input boxes)
790 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory([
791 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Left/Right/Up/Down
792 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
793 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [37, 39, 38, 40],
794 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
795 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var direction = (keyCode === 37 || keyCode === 38) ? -1 : 1;
796 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Try to highlight next/prev button
797 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!chart.highlightRangeSelectorButton(chart.highlightedRangeSelectorItemIx + direction)) {
798 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(direction);
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) { // Enter/Spacebar
803 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
804 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [13, 32],
805 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
806 < 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
807 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fakeClickEvent(chart.rangeSelector.buttons[chart.highlightedRangeSelectorItemIx].element);
808 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
809 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
810 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
811 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
812 < 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
813 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
814 < 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;
815 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
816  
817 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make elements focusable and accessible
818 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
819 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(chart.rangeSelector.buttons, function(button) {
820 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('tabindex', '-1');
821 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('role', 'button');
822 < 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));
823 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
824 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Focus first/last button
825 < 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);
826 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
827 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }),
828  
829 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highstock range selector, input boxes
830 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory([
831 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Tab/Up/Down
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) { [9, 38, 40],
834 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode, e) {
835 < 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,
836 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newIx = chart.highlightedInputRangeIx = chart.highlightedInputRangeIx + direction;
837 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Try to highlight next/prev item in list.
838 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newIx > 1 || newIx < 0) { // Out of range
839 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(direction);
840 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
841 < 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
842 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
843 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
844 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
845 < 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
846 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
847 < 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';
848 < 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;
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) { // Handle tabs different from left/right (because we don't want to catch left/right in a text area)
852 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { transformTabs: false,
853  
854 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highlight first/last input box
855 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
856 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightedInputRangeIx = direction > 0 ? 0 : 1;
857 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.rangeSelector[chart.highlightedInputRangeIx ? 'maxInput' : 'minInput'].focus();
858 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
859 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }),
860  
861 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Legend navigation
862 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory([
863 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Left/Right/Up/Down
864 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
865 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [37, 39, 38, 40],
866 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
867 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var direction = (keyCode === 37 || keyCode === 38) ? -1 : 1;
868 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Try to highlight next/prev legend item
869 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!chart.highlightLegendItem(chart.highlightedLegendItemIx + direction)) {
870 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(direction);
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) { }
873 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
874 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enter/Spacebar
875 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
876 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [13, 32],
877 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
878 < 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);
879 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
880 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
881 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
882 < 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.
883 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Don't run if the legend is populated by a colorAxis.
884 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
885 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return chart.legend && chart.legend.allItems &&
886 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { !(chart.colorAxis && chart.colorAxis.length);
887 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
888  
889 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make elements focusable and accessible
890 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
891 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(chart.legend.allItems, function(item) {
892 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { item.legendGroup.element.setAttribute('tabindex', '-1');
893 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { item.legendGroup.element.setAttribute('role', 'button');
894 < 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);
895 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
896 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Focus first/last item
897 < 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);
898 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
899 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { })
900 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ];
901  
902 < 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.
903 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.keyboardNavigationModuleIndex = 0;
904  
905 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make chart reachable by tab
906 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (
907 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.container.hasAttribute &&
908 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { !chart.container.hasAttribute('tabIndex')
909 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ) {
910 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.container.setAttribute('tabindex', '0');
911 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
912  
913 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Handle keyboard events
914 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { addEvent(chart.renderTo, 'keydown', keydownHandler);
915 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { addEvent(chart, 'destroy', function() {
916 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { removeEvent(chart.renderTo, 'keydown', keydownHandler);
917 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
918 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
919  
920 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add screen reader region to chart.
921 < 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.
922 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.addScreenReaderRegion = function(id, tableId) {
923 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var chart = this,
924 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { series = chart.series,
925 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { options = chart.options,
926 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { a11yOptions = options.accessibility,
927 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection = chart.screenReaderRegion = doc.createElement('div'),
928 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcut = doc.createElement('h4'),
929 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcutAnchor = doc.createElement('a'),
930 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chartHeading = doc.createElement('h4'),
931 < 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
932 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { position: 'absolute',
933 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { left: '-9999px',
934 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { top: 'auto',
935 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { width: '1px',
936 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { height: '1px',
937 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { overflow: 'hidden'
938 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
939 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chartTypes = chart.types || [],
940 < 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?)
941 < 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(),
942 < 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
943  
944 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.setAttribute('id', id);
945 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.setAttribute('role', 'region');
946 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.setAttribute('aria-label', 'Chart screen reader information.');
947  
948 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.innerHTML = a11yOptions.screenReaderSectionFormatter && a11yOptions.screenReaderSectionFormatter(chart) ||
949 < 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' +
950 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (series.length > 1 ? ' and navigate between data series' : '') +
951 < 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') +
952 < 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) : '') +
953 < 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.') +
954 < 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>' +
955 < 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 + ' ' +
956 < 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>' : '') +
957 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (axesDesc.xAxis ? ('<div>' + axesDesc.xAxis + '</div>') : '') +
958 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (axesDesc.yAxis ? ('<div>' + axesDesc.yAxis + '</div>') : '');
959  
960 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add shortcut to data table if export-data is loaded
961 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.getCSV) {
962 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcutAnchor.innerHTML = 'View as data table.';
963 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcutAnchor.href = '#' + tableId;
964 < 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
965 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcutAnchor.onclick = a11yOptions.onTableAnchorClick || function() {
966 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.viewData();
967 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { doc.getElementById(tableId).focus();
968 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
969 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcut.appendChild(tableShortcutAnchor);
970 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.appendChild(tableShortcut);
971 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
972  
973 < 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
974 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // h4 element as title for the chart.
975 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chartHeading.innerHTML = 'Chart graphic.';
976 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.renderTo.insertBefore(chartHeading, chart.renderTo.firstChild);
977 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.renderTo.insertBefore(hiddenSection, chart.renderTo.firstChild);
978  
979 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Hide the section and the chart heading
980 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { merge(true, chartHeading.style, hiddenStyle);
981 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { merge(true, hiddenSection.style, hiddenStyle);
982 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
983  
984  
985 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make chart container accessible, and wrap table functionality
986 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.callbacks.push(function(chart) {
987 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var options = chart.options,
988 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { a11yOptions = options.accessibility;
989  
990 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!a11yOptions.enabled) {
991 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return;
992 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
993  
994 < 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'),
995 < 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'),
996 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { descElement = chart.container.getElementsByTagName('desc')[0],
997 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { textElements = chart.container.getElementsByTagName('text'),
998 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { titleId = 'highcharts-title-' + chart.index,
999 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableId = 'highcharts-data-table-' + chart.index,
1000 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSectionId = 'highcharts-information-region-' + chart.index,
1001 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chartTitle = options.title.text || 'Chart',
1002 < 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,
1003 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { topLevelColumns = [];
1004  
1005 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add SVG title/desc tags
1006 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { titleElement.textContent = htmlencode(chartTitle);
1007 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { titleElement.id = titleId;
1008 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { descElement.parentNode.insertBefore(titleElement, descElement);
1009 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.renderTo.setAttribute('role', 'region');
1010 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { //chart.container.setAttribute('aria-details', hiddenSectionId); // JAWS currently doesn't handle this too well
1011 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.renderTo.setAttribute('aria-label', 'Interactive chart. ' + chartTitle +
1012 < 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.');
1013  
1014 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set screen reader properties on export menu
1015 < 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) {
1016 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var oldExportCallback = chart.exportSVGElements[0].element.onclick,
1017 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { parent = chart.exportSVGElements[0].element.parentNode;
1018 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.exportSVGElements[0].element.onclick = function() {
1019 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { oldExportCallback.apply(this, Array.prototype.slice.call(arguments));
1020 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.addAccessibleContextMenuAttribs();
1021 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightExportItem(0);
1022 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
1023 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.exportSVGElements[0].element.setAttribute('role', 'button');
1024 < 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');
1025 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportGroupElement.appendChild(chart.exportSVGElements[0].element);
1026 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportGroupElement.setAttribute('role', 'region');
1027 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportGroupElement.setAttribute('aria-label', 'Chart export menu');
1028 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { parent.appendChild(exportGroupElement);
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) { // 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
1032 < 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.
1033 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.rangeSelector) {
1034 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(['minInput', 'maxInput'], function(key, i) {
1035 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.rangeSelector[key]) {
1036 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.rangeSelector[key].setAttribute('tabindex', '-1');
1037 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.rangeSelector[key].setAttribute('role', 'textbox');
1038 < 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.');
1039 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1040 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1041 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1042  
1043 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Hide text elements from screen readers
1044 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(textElements, function(el) {
1045 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { el.setAttribute('aria-hidden', 'true');
1046 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1047  
1048 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add top-secret screen reader region
1049 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.addScreenReaderRegion(hiddenSectionId, tableId);
1050  
1051 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enable keyboard navigation
1052 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (a11yOptions.keyboardNavigation.enabled) {
1053 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.addKeyboardNavEvents();
1054 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1055  
1056 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { /* Wrap table functionality from export-data */
1057  
1058 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Keep track of columns
1059 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { merge(true, options.exporting, {
1060 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { csv: {
1061 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { columnHeaderFormatter: function(item, key, keyLength) {
1062 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!item) {
1063 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return 'Category';
1064 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1065 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (item instanceof H.Axis) {
1066 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return (item.options.title && item.options.title.text) ||
1067 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (item.isDatetimeAxis ? 'DateTime' : 'Category');
1068 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1069 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var prevCol = topLevelColumns[topLevelColumns.length - 1];
1070 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (keyLength > 1) {
1071 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // We need multiple levels of column headers
1072 < 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-data
1073 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if ((prevCol && prevCol.text) !== item.name) {
1074 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { topLevelColumns.push({
1075 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { text: item.name,
1076 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { span: keyLength
1077 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1078 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1079 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1080 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (oldColumnHeaderFormatter) {
1081 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return oldColumnHeaderFormatter.call(this, item, key, keyLength);
1082 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1083 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return keyLength > 1 ? key : item.name;
1084 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1085 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1086 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1087  
1088 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add ID and title/caption to table HTML
1089 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.wrap(chart, 'getTable', function(proceed) {
1090 < 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))
1091 < 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>');
1092 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1093  
1094 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add accessibility attributes and top level columns
1095 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.wrap(chart, 'viewData', function(proceed) {
1096 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!this.dataTableDiv) {
1097 < 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));
1098  
1099 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var table = doc.getElementById(tableId),
1100 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { head = table.getElementsByTagName('thead')[0],
1101 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { body = table.getElementsByTagName('tbody')[0],
1102 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { firstRow = head.firstChild.children,
1103 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { columnHeaderRow = '<tr><td></td>',
1104 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { cell,
1105 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newCell;
1106  
1107 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make table focusable by script
1108 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { table.setAttribute('tabindex', '-1');
1109  
1110 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Create row headers
1111 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(body.children, function(el) {
1112 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { cell = el.firstChild;
1113 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newCell = doc.createElement('th');
1114 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newCell.setAttribute('scope', 'row');
1115 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newCell.innerHTML = cell.innerHTML;
1116 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { cell.parentNode.replaceChild(newCell, cell);
1117 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1118  
1119 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set scope for column headers
1120 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(firstRow, function(el) {
1121 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (el.tagName === 'TH') {
1122 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { el.setAttribute('scope', 'col');
1123 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1124 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1125  
1126 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add top level columns
1127 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (topLevelColumns.length) {
1128 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(topLevelColumns, function(col) {
1129 < 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>';
1130 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1131 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { head.insertAdjacentHTML('afterbegin', columnHeaderRow);
1132 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1133 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1134 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1135 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1136  
1137 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }(Highcharts));
1138 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) {}));