corrade-nucleus-nucleons – Blame information for rev 31

Subversion Repositories:
Rev:
Rev Author Line No. Line
31 office 1 /**
2 * @license Highcharts JS v5.0.14 (2017-07-28)
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 /**
90 * Accessibility options
91 * @type {Object}
92 * @optionparent
93 */
94 H.setOptions({
95  
96 /**
97 * Options for configuring accessibility for the chart. Requires the
98 * [accessibility module](//code.highcharts.com/modules/accessibility.
99 * js) to be loaded. For a description of the module and information
100 * on its features, see [Highcharts Accessibility](http://www.highcharts.
101 * com/docs/chart-concepts/accessibility).
102 *
103 * @since 5.0.0
104 * @product highcharts highstock highmaps
105 */
106 accessibility: {
107  
108 /**
109 * Enable accessibility features for the chart.
110 *
111 * @type {Boolean}
112 * @default true
113 * @since 5.0.0
114 * @product highcharts highstock highmaps
115 */
116 enabled: true,
117  
118 /**
119 * When a series contains more points than this, we no longer expose
120 * information about individual points to screen readers.
121 *
122 * Set to `false` to disable.
123 *
124 * @type {Number|Boolean}
125 * @default 30
126 * @since 5.0.0
127 * @product highcharts highstock highmaps
128 */
129 pointDescriptionThreshold: 30, // set to false to disable
130  
131 /**
132 * Options for keyboard navigation.
133 *
134 * @type {Object}
135 * @since 5.0.0
136 * @product highcharts highstock highmaps
137 */
138 keyboardNavigation: {
139  
140 /**
141 * Enable keyboard navigation for the chart.
142 *
143 * @type {Boolean}
144 * @default true
145 * @since 5.0.0
146 */
147 enabled: true,
148  
149 /**
150 * Enable tab navigation for points. Without this, only arrow keys
151 * can be used to navigate between points.
152 *
153 * @type {Boolean}
154 * @default {all} true
155 * @since next
156 */
157 tabThroughPoints: true
158  
159 /**
160 * Skip null points when navigating through points with the
161 * keyboard.
162 *
163 * @type {Boolean}
164 * @default false
165 * @since 5.0.0
166 * @apioption accessibility.keyboardNavigation.skipNullPoints
167 */
168 }
169  
170 /**
171 * Whether or not to add series descriptions to charts with a single
172 * series.
173 *
174 * @type {Boolean}
175 * @default false
176 * @since 5.0.0
177 * @product highcharts highstock highmaps
178 * @apioption accessibility.describeSingleSeries
179 */
180  
181 /**
182 * Function to run upon clicking the "View as Data Table" link in the
183 * screen reader region.
184 *
185 * By default Highcharts will insert and set focus to a data table
186 * representation of the chart.
187 *
188 * @type {Function}
189 * @since 5.0.0
190 * @apioption accessibility.onTableAnchorClick
191 */
192  
193 /**
194 * Date format to use for points on datetime axes when describing them
195 * to screen reader users.
196 *
197 * Defaults to the same format as in tooltip.
198 *
199 * For an overview of the replacement codes, see [dateFormat](
200 * #Highcharts.dateFormat).
201 *
202 * @type {String}
203 * @see [pointDateFormatter](#accessibility.pointDateFormatter)
204 * @since 5.0.0
205 * @apioption accessibility.pointDateFormat
206 */
207  
208 /**
209 * Formatter function to determine the date/time format used with points
210 * on datetime axes when describing them to screen reader users. Receives
211 * one argument, `point`, referring to the point to describe. Should
212 * return a date format string compatible with [dateFormat](#Highcharts.
213 * dateFormat).
214 *
215 * @type {Function}
216 * @see [pointDateFormat](#accessibility.pointDateFormat)
217 * @since 5.0.0
218 * @apioption accessibility.pointDateFormatter
219 */
220  
221 /**
222 * Formatter function to use instead of the default for point descriptions.
223 * Receives one argument, `point`, referring to the point to describe.
224 * Should return a String with the description of the point for a screen
225 * reader user.
226 *
227 * @type {Function}
228 * @see [point.description](#series<line>.data.description)
229 * @since 5.0.0
230 * @apioption accessibility.pointDescriptionFormatter
231 */
232  
233 /**
234 * A formatter function to create the HTML contents of the hidden screen
235 * reader information region. Receives one argument, `chart`, referring
236 * to the chart object. Should return a String with the HTML content
237 * of the region.
238 *
239 * The link to view the chart as a data table will be added automatically
240 * after the custom HTML content.
241 *
242 * @type {Function}
243 * @default undefined
244 * @since 5.0.0
245 * @apioption accessibility.screenReaderSectionFormatter
246 */
247  
248 /**
249 * Formatter function to use instead of the default for series descriptions.
250 * Receives one argument, `series`, referring to the series to describe.
251 * Should return a String with the description of the series for a
252 * screen reader user.
253 *
254 * @type {Function}
255 * @see [series.description](#plotOptions.series.description)
256 * @since 5.0.0
257 * @apioption accessibility.seriesDescriptionFormatter
258 */
259 }
260 });
261  
262 /**
263 * A text description of the chart.
264 *
265 * If the Accessibility module is loaded, this is included by default
266 * as a long description of the chart and its contents in the hidden
267 * screen reader information region.
268 *
269 * @type {String}
270 * @see [typeDescription](#chart.typeDescription)
271 * @default undefined
272 * @since 5.0.0
273 * @apioption chart.description
274 */
275  
276 /**
277 * A text description of the chart type.
278 *
279 * If the Accessibility module is loaded, this will be included in the
280 * description of the chart in the screen reader information region.
281 *
282 *
283 * Highcharts will by default attempt to guess the chart type, but for
284 * more complex charts it is recommended to specify this property for
285 * clarity.
286 *
287 * @type {String}
288 * @default undefined
289 * @since 5.0.0
290 * @apioption chart.typeDescription
291 */
292  
293 /**
294 * HTML encode some characters vulnerable for XSS.
295 * @param {string} html The input string
296 * @return {string} The excaped string
297 */
298 function htmlencode(html) {
299 return html
300 .replace(/&/g, '&amp;')
301 .replace(/g, '&lt;')
302 .replace(/>/g, '&gt;')
303 .replace(/"/g, '&quot;')
304 .replace(/'/g, '&#x27;')
305 .replace(/\//g, '&#x2F;');
306 }
307  
308 // Utility function. Reverses child nodes of a DOM element
309 function reverseChildNodes(node) {
310 var i = node.childNodes.length;
311 while (i--) {
312 node.appendChild(node.childNodes[i]);
313 }
314 }
315  
316 // Utility function to attempt to fake a click event on an element
317 function fakeClickEvent(element) {
318 var fakeEvent;
319 if (element && element.onclick && doc.createEvent) {
320 fakeEvent = doc.createEvent('Events');
321 fakeEvent.initEvent('click', true, false);
322 element.onclick(fakeEvent);
323 }
324 }
325  
326 // Whenever drawing series, put info on DOM elements
327 H.wrap(H.Series.prototype, 'render', function(proceed) {
328 proceed.apply(this, Array.prototype.slice.call(arguments, 1));
329 if (this.chart.options.accessibility.enabled) {
330 this.setA11yDescription();
331 }
332 });
333  
334 // Put accessible info on series and points of a series
335 H.Series.prototype.setA11yDescription = function() {
336 var a11yOptions = this.chart.options.accessibility,
337 firstPointEl = this.points && this.points.length && this.points[0].graphic && this.points[0].graphic.element,
338 seriesEl = firstPointEl && firstPointEl.parentNode || this.graph && this.graph.element || this.group && this.group.element; // Could be tracker series depending on series type
339  
340 if (seriesEl) {
341 // For some series types the order of elements do not match the order of points in series
342 // In that case we have to reverse them in order for AT to read them out in an understandable order
343 if (seriesEl.lastChild === firstPointEl) {
344 reverseChildNodes(seriesEl);
345 }
346 // Make individual point elements accessible if possible. Note: If markers are disabled there might not be any elements there to make accessible.
347 if (this.points && (this.points.length < a11yOptions.pointDescriptionThreshold || a11yOptions.pointDescriptionThreshold === false)) {
348 each(this.points, function(point) {
349 if (point.graphic) {
350 point.graphic.element.setAttribute('role', 'img');
351 point.graphic.element.setAttribute('tabindex', '-1');
352 point.graphic.element.setAttribute('aria-label',
353 point.series.options.pointDescriptionFormatter &&
354 point.series.options.pointDescriptionFormatter(point) ||
355 a11yOptions.pointDescriptionFormatter &&
356 a11yOptions.pointDescriptionFormatter(point) ||
357 point.buildPointInfoString());
358 }
359 });
360 }
361 // Make series element accessible
362 if (this.chart.series.length > 1 || a11yOptions.describeSingleSeries) {
363 seriesEl.setAttribute(
364 'role',
365 this.options.exposeElementToA11y ? 'img' : 'region'
366 );
367 seriesEl.setAttribute('tabindex', '-1');
368 seriesEl.setAttribute('aria-label', a11yOptions.seriesDescriptionFormatter && a11yOptions.seriesDescriptionFormatter(this) ||
369 this.buildSeriesInfoString());
370 }
371 }
372 };
373  
374 // Return string with information about series
375 H.Series.prototype.buildSeriesInfoString = function() {
376 var typeInfo = typeToSeriesMap[this.type] || typeToSeriesMap['default'], // eslint-disable-line dot-notation
377 description = this.description || this.options.description;
378 return (this.name ? this.name + ', ' : '') +
379 (this.chart.types.length === 1 ? typeInfo[0] : 'series') + ' ' + (this.index + 1) + ' of ' + (this.chart.series.length) +
380 (this.chart.types.length === 1 ? ' with ' : '. ' + typeInfo[0] + ' with ') +
381 (this.points.length + ' ' + (this.points.length === 1 ? typeInfo[1] : typeInfo[2])) +
382 (description ? '. ' + description : '') +
383 (this.chart.yAxis.length > 1 && this.yAxis ? '. Y axis, ' + this.yAxis.getDescription() : '') +
384 (this.chart.xAxis.length > 1 && this.xAxis ? '. X axis, ' + this.xAxis.getDescription() : '');
385 };
386  
387 // Return string with information about point
388 H.Point.prototype.buildPointInfoString = function() {
389 var point = this,
390 series = point.series,
391 a11yOptions = series.chart.options.accessibility,
392 infoString = '',
393 dateTimePoint = series.xAxis && series.xAxis.isDatetimeAxis,
394 timeDesc = dateTimePoint && dateFormat(a11yOptions.pointDateFormatter && a11yOptions.pointDateFormatter(point) || a11yOptions.pointDateFormat ||
395 H.Tooltip.prototype.getXDateFormat(point, series.chart.options.tooltip, series.xAxis), point.x),
396 hasSpecialKey = H.find(series.specialKeys, function(key) {
397 return point[key] !== undefined;
398 });
399  
400 // If the point has one of the less common properties defined, display all that are defined
401 if (hasSpecialKey) {
402 if (dateTimePoint) {
403 infoString = timeDesc;
404 }
405 each(series.commonKeys.concat(series.specialKeys), function(key) {
406 if (point[key] !== undefined && !(dateTimePoint && key === 'x')) {
407 infoString += (infoString ? '. ' : '') + key + ', ' + point[key];
408 }
409 });
410 } else {
411 // Pick and choose properties for a succint label
412 infoString = (this.name || timeDesc || this.category || this.id || 'x, ' + this.x) + ', ' +
413 (this.value !== undefined ? this.value : this.y);
414 }
415  
416 return (this.index + 1) + '. ' + infoString + '.' + (this.description ? ' ' + this.description : '');
417 };
418  
419 // Get descriptive label for axis
420 H.Axis.prototype.getDescription = function() {
421 return this.userOptions && this.userOptions.description || this.axisTitle && this.axisTitle.textStr ||
422 this.options.id || this.categories && 'categories' || 'values';
423 };
424  
425 // Pan along axis in a direction (1 or -1), optionally with a defined granularity (number of steps it takes to walk across current view)
426 H.Axis.prototype.panStep = function(direction, granularity) {
427 var gran = granularity || 3,
428 extremes = this.getExtremes(),
429 step = (extremes.max - extremes.min) / gran * direction,
430 newMax = extremes.max + step,
431 newMin = extremes.min + step,
432 size = newMax - newMin;
433 if (direction < 0 && newMin < extremes.dataMin) {
434 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { newMin = extremes.dataMin;
435 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { newMax = newMin + size;
436 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { } else if (direction > 0 && newMax > extremes.dataMax) {
437 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { newMax = extremes.dataMax;
438 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { newMin = newMax - size;
439 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { }
440 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { this.setExtremes(newMin, newMax);
441 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { };
442  
443 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { // Whenever adding or removing series, keep track of types present in chart
444 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { H.wrap(H.Series.prototype, 'init', function(proceed) {
445 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { proceed.apply(this, Array.prototype.slice.call(arguments, 1));
446 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { var chart = this.chart;
447 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { if (chart.options.accessibility.enabled) {
448 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { chart.types = chart.types || [];
449  
450 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { // Add type to list if does not exist
451 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) { if (chart.types.indexOf(this.type) < 0) {
452 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { chart.types.push(this.type);
453 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { }
454  
455 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { addEvent(this, 'remove', function() {
456 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { var removedSeries = this,
457 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { hasType = false;
458  
459 < 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.
460 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { each(chart.series, function(s) {
461 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) { if (s !== removedSeries && chart.types.indexOf(removedSeries.type) < 0) {
462 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { hasType = true;
463 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { }
464 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { });
465 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { if (!hasType) {
466 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { erase(chart.types, removedSeries.type);
467 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { }
468 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { });
469 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { }
470 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { });
471  
472 < 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.
473 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { H.Chart.prototype.getTypeDescription = function() {
474 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { var firstType = this.types && this.types[0],
475 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { mapTitle = this.series[0] && this.series[0].mapTitle;
476 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { if (!firstType) {
477 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return 'Empty chart.';
478 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { } else if (firstType === 'map') {
479 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return mapTitle ? 'Map of ' + mapTitle : 'Map of unspecified region.';
480 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { } else if (this.types.length > 1) {
481 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return 'Combination chart.';
482 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { } else if (['spline', 'area', 'areaspline'].indexOf(firstType) > -1) {
483 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return 'Line chart.';
484 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { }
485 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { return firstType + ' chart.' + (typeDescriptionMap[firstType] || '');
486 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { };
487  
488 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { // Return object with text description of each of the chart's axes
489 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { H.Chart.prototype.getAxesDescription = function() {
490 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { var numXAxes = this.xAxis.length,
491 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { numYAxes = this.yAxis.length,
492 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { desc = {},
493 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { i;
494  
495 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { if (numXAxes) {
496 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { desc.xAxis = 'The chart has ' + numXAxes + (numXAxes > 1 ? ' X axes' : ' X axis') + ' displaying ';
497 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) { if (numXAxes < 2) {
498 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) { desc.xAxis += this.xAxis[0].getDescription() + '.';
499 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) { } else {
500 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) { for (i = 0; i < numXAxes - 1; ++i) {
501 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { desc.xAxis += (i ? ', ' : '') + this.xAxis[i].getDescription();
502 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { }
503 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { desc.xAxis += ' and ' + this.xAxis[i].getDescription() + '.';
504 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { }
505 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { }
506  
507 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { if (numYAxes) {
508 < 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 ';
509 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) { if (numYAxes < 2) {
510 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) { desc.yAxis += this.yAxis[0].getDescription() + '.';
511 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) { } else {
512 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) { for (i = 0; i < numYAxes - 1; ++i) {
513 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { desc.yAxis += (i ? ', ' : '') + this.yAxis[i].getDescription();
514 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
515 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { desc.yAxis += ' and ' + this.yAxis[i].getDescription() + '.';
516 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
517 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
518  
519 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return desc;
520 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
521  
522 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set a11y attribs on exporting menu
523 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.addAccessibleContextMenuAttribs = function() {
524 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var exportList = this.exportDivElements;
525 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (exportList) {
526 < 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
527 < 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
528 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(exportList, function(item) {
529 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (item.tagName === 'DIV' &&
530 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { !(item.children && item.children.length)) {
531 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { item.setAttribute('role', 'menuitem');
532 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { item.setAttribute('tabindex', -1);
533 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
534 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
535 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set accessibility properties on parent div
536 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportList[0].parentNode.setAttribute('role', 'menu');
537 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportList[0].parentNode.setAttribute('aria-label', 'Chart export');
538 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
539 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
540  
541 < 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.
542 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Point.prototype.highlight = function() {
543 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var chart = this.series.chart;
544 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (this.graphic && this.graphic.element.focus) {
545 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.graphic.element.focus();
546 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
547 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!this.isNull) {
548 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.onMouseOver(); // Show the hover marker
549 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Show the tooltip
550 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.tooltip) {
551 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.tooltip.refresh(chart.tooltip.shared ? [this] : this);
552 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
553 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { } else {
554 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.tooltip) {
555 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.tooltip.hide(0);
556 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
557 < 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
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) { chart.highlightedPoint = this;
560 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this;
561 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
562  
563 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Function to highlight next/previous point in chart
564 < 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
565 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // highlight in chosen direction)
566 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.highlightAdjacentPoint = function(next) {
567 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var chart = this,
568 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { series = chart.series,
569 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPoint = chart.highlightedPoint,
570 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPointIndex = curPoint && curPoint.index || 0,
571 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPoints = curPoint && curPoint.series.points,
572 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { lastSeries = chart.series && chart.series[chart.series.length - 1],
573 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { lastPoint = lastSeries && lastSeries.points &&
574 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { lastSeries.points[lastSeries.points.length - 1],
575 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries,
576 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newPoint,
577 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { isSkipPoint = function(point) {
578 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return point.isNull &&
579 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.options.accessibility.keyboardNavigation.skipNullPoints ||
580 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { point.series.options.skipKeyboardNavigation ||
581 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { !point.series.visible;
582 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
583 < 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
584 < 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.
585 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { forwardSkipAmount = curPoint && curPoint.series.connectEnds &&
586 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPointIndex > curPoints.length - 3 ? 2 : 1;
587  
588 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // If no points, return false
589 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!series[0] || !series[0].points) {
590 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return false;
591 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
592  
593 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!curPoint) {
594 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // No point is highlighted yet. Try first/last point depending on move
595 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // direction
596 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newPoint = next ? series[0].points[0] : lastPoint;
597 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { } else {
598 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // We have a highlighted point.
599 < 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
600 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // dataGrouping (and maybe zoom?)
601 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curPoints[curPointIndex] !== curPoint) {
602 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { for (var i = 0; i < curPoints.length; ++i) {
603 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curPoints[i] === curPoint) {
604 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curPointIndex = i;
605 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { break;
606 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
607 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
608 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
609  
610 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Grab next/prev point & series
611 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries = series[curPoint.series.index + (next ? 1 : -1)];
612 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newPoint = curPoints[curPointIndex + (next ? forwardSkipAmount : -1)] ||
613 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Done with this series, try next one
614 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries &&
615 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries.points[next ? 0 : newSeries.points.length - (
616 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries.connectEnds ? 2 : 1
617 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { )];
618  
619 < 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
620 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newPoint === undefined) {
621 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return false;
622 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
623 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
624  
625 < 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
626 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (isSkipPoint(newPoint)) {
627 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightedPoint = newPoint;
628 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return chart.highlightAdjacentPoint(next);
629 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
630  
631 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // There is an adjacent point, highlight it
632 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return newPoint.highlight();
633 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
634  
635 < 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)
636 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.showExportMenu = function() {
637 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (this.exportSVGElements && this.exportSVGElements[0]) {
638 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.exportSVGElements[0].element.onclick();
639 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightExportItem(0);
640 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
641 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
642  
643 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highlight export menu item by index
644 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.highlightExportItem = function(ix) {
645 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var listItem = this.exportDivElements && this.exportDivElements[ix],
646 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curHighlighted = this.exportDivElements && this.exportDivElements[this.highlightedExportItem];
647  
648 < 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)) {
649 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (listItem.focus) {
650 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { listItem.focus();
651 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
652 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curHighlighted && curHighlighted.onmouseout) {
653 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curHighlighted.onmouseout();
654 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
655 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (listItem.onmouseover) {
656 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { listItem.onmouseover();
657 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
658 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedExportItem = ix;
659 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return true;
660 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
661 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
662  
663 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highlight range selector button by index
664 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.highlightRangeSelectorButton = function(ix) {
665 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var buttons = this.rangeSelector.buttons;
666 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Deselect old
667 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (buttons[this.highlightedRangeSelectorItemIx]) {
668 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { buttons[this.highlightedRangeSelectorItemIx].setState(this.oldRangeSelectorItemState || 0);
669 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
670 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Select new
671 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedRangeSelectorItemIx = ix;
672 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (buttons[ix]) {
673 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (buttons[ix].element.focus) {
674 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { buttons[ix].element.focus();
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) { this.oldRangeSelectorItemState = buttons[ix].state;
677 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { buttons[ix].setState(2);
678 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return true;
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) { return false;
681 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
682  
683 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highlight legend item by index
684 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.highlightLegendItem = function(ix) {
685 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var items = this.legend.allItems;
686 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (items[this.highlightedLegendItemIx]) {
687 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fireEvent(items[this.highlightedLegendItemIx].legendGroup.element, 'mouseout');
688 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
689 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedLegendItemIx = ix;
690 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (items[ix]) {
691 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (items[ix].legendGroup.element.focus) {
692 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { items[ix].legendGroup.element.focus();
693 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
694 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fireEvent(items[ix].legendGroup.element, 'mouseover');
695 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return true;
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) { return false;
698 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
699  
700 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Hide export menu
701 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.hideExportMenu = function() {
702 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var exportList = this.exportDivElements;
703 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (exportList) {
704 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(exportList, function(el) {
705 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fireEvent(el, 'mouseleave');
706 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
707 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (exportList[this.highlightedExportItem] && exportList[this.highlightedExportItem].onmouseout) {
708 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportList[this.highlightedExportItem].onmouseout();
709 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
710 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.highlightedExportItem = 0;
711 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.renderTo.focus();
712 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
713 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
714  
715 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add keyboard navigation handling to chart
716 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.addKeyboardNavEvents = function() {
717 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var chart = this;
718  
719 < 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.
720 < 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.
721 < 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.
722 < 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.
723 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Terminate holds a function to run once before moving to next/prev module.
724 < 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.
725 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function KeyboardNavigationModule(options) {
726 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.id = options.id;
727 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.keyCodeMap = options.keyCodeMap;
728 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.move = options.move;
729 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.validate = options.validate;
730 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.init = options.init;
731 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.terminate = options.terminate;
732 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.transformTabs = options.transformTabs !== false;
733 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
734 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { KeyboardNavigationModule.prototype = {
735 < 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.
736 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { run: function(e) {
737 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var navModule = this,
738 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { keyCode = e.which || e.keyCode,
739 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { handled = false;
740 < 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
741 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(this.keyCodeMap, function(codeSet) {
742 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (codeSet[0].indexOf(keyCode) > -1) {
743 < 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
744 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
745 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
746 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return handled;
747 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
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) { // Maintain abstraction between KeyboardNavigationModule and Highcharts
750 < 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
751 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function navModuleFactory(id, keyMap, options) {
752 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return new KeyboardNavigationModule(merge({
753 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { keyCodeMap: keyMap,
754 < 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.
755 < 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.
756 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { move: function(direction) {
757 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (this.terminate) {
758 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { this.terminate(direction);
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) { chart.keyboardNavigationModuleIndex += direction;
761 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var newModule = chart.keyboardNavigationModules[chart.keyboardNavigationModuleIndex];
762 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newModule) {
763 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newModule.validate && !newModule.validate()) {
764 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(direction); // Invalid module
765 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
766 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newModule.init) {
767 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newModule.init(direction); // Valid module, init it
768 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return true;
769 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
770 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
771 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // No module
772 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.keyboardNavigationModuleIndex = 0; // Reset counter
773 < 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
774 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return false;
775 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
776 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }, {
777 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { id: id
778 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }, options));
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) { // Route keydown events
782 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function keydownHandler(ev) {
783 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var e = ev || win.event,
784 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { keyCode = e.which || e.keyCode,
785 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { curNavModule = chart.keyboardNavigationModules[chart.keyboardNavigationModuleIndex];
786  
787 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Handle tabbing
788 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (keyCode === 9) {
789 < 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
790 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.slipNextTab) {
791 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.slipNextTab = false;
792 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return;
793 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
794 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
795 < 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
796 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.slipNextTab = false;
797  
798 < 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.
799 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curNavModule) {
800 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (curNavModule.run(e)) {
801 < 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.
802 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
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) { }
805  
806 < 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.
807 < 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.
808 < 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.
809 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.keyboardNavigationModules = [
810 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Points
811 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory('points', [
812 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Left/Right
813 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
814 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [37, 39],
815 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
816 < 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
817 < 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
818 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
819 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
820 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
821 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Up/Down
822 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
823 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [38, 40],
824 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
825 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var newSeries;
826 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightedPoint) {
827 < 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
828 < 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
829 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newSeries.points[0].highlight();
830 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { } else {
831 < 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
832 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
833 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
834 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
835 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
836 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enter/Spacebar
837 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
838 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [13, 32],
839 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
840 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightedPoint) {
841 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightedPoint.firePointEvent('click');
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) { ], {
846 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Always start highlighting from scratch when entering this module
847 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function() {
848 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { delete chart.highlightedPoint;
849 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
850 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // If leaving points, don't show tooltip anymore
851 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { terminate: function() {
852 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.tooltip) {
853 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.tooltip.hide(0);
854 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
855 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { delete chart.highlightedPoint;
856 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
857  
858 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { transformTabs: chart.options.accessibility.keyboardNavigation.tabThroughPoints
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) { // Exporting
862 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory('exporting', [
863 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Left/Up
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, 38],
866 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
867 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var i = chart.highlightedExportItem || 0,
868 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { reachedEnd = true;
869 < 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.
870 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { while (i--) {
871 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightExportItem(i)) {
872 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { reachedEnd = false;
873 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { break;
874 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
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) { if (reachedEnd) {
877 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.hideExportMenu();
878 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(-1);
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) { // Right/Down
883 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
884 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [39, 40],
885 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
886 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var highlightedExportItem = chart.highlightedExportItem || 0,
887 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { reachedEnd = true;
888 < 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.
889 < 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) {
890 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightExportItem(i)) {
891 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { reachedEnd = false;
892 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { break;
893 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
894 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
895 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (reachedEnd) {
896 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.hideExportMenu();
897 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(1); // Next module
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 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enter/Spacebar
902 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
903 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [13, 32],
904 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
905 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fakeClickEvent(chart.exportDivElements[chart.highlightedExportItem]);
906 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
907 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
908 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
909 < 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
910 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
911 < 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);
912 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
913 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Show export menu
914 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
915 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightedPoint = null;
916 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.showExportMenu();
917 < 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
918 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (direction < 0 && chart.exportDivElements) {
919 < 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) {
920 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.highlightExportItem(i)) {
921 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { break;
922 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
923 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
924 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
925 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
926 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }),
927  
928 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Map zoom
929 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory('mapZoom', [
930 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Up/down/left/right
931 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
932 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [38, 40, 37, 39],
933 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
934 < 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);
935 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
936 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
937  
938 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Tabs
939 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
940 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [9],
941 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode, e) {
942 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var button;
943 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.mapNavButtons[chart.focusedMapNavButtonIx].setState(0); // Deselect old
944 < 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?
945 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.mapZoom(); // Reset zoom
946 < 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
947 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
948 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.focusedMapNavButtonIx += e.shiftKey ? -1 : 1;
949 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button = chart.mapNavButtons[chart.focusedMapNavButtonIx];
950 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (button.element.focus) {
951 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.focus();
952 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
953 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.setState(2);
954 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
955 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
956  
957 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enter/Spacebar
958 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
959 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [13, 32],
960 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
961 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fakeClickEvent(chart.mapNavButtons[chart.focusedMapNavButtonIx].element);
962 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
963 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
964 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
965 < 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
966 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
967 < 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;
968 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
969  
970 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Handle tabs separately
971 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { transformTabs: false,
972  
973 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make zoom buttons do their magic
974 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
975 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var zoomIn = chart.mapNavButtons[0],
976 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { zoomOut = chart.mapNavButtons[1],
977 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { initialButton = direction > 0 ? zoomIn : zoomOut;
978  
979 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(chart.mapNavButtons, function(button, i) {
980 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('tabindex', -1);
981 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('role', 'button');
982 < 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');
983 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
984  
985 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (initialButton.element.focus) {
986 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { initialButton.element.focus();
987 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
988 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { initialButton.setState(2);
989 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.focusedMapNavButtonIx = direction > 0 ? 0 : 1;
990 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
991 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }),
992  
993 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highstock range selector (minus input boxes)
994 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory('rangeSelector', [
995 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Left/Right/Up/Down
996 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
997 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [37, 39, 38, 40],
998 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
999 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var direction = (keyCode === 37 || keyCode === 38) ? -1 : 1;
1000 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Try to highlight next/prev button
1001 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!chart.highlightRangeSelectorButton(chart.highlightedRangeSelectorItemIx + direction)) {
1002 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(direction);
1003 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1004 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1005 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ],
1006 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enter/Spacebar
1007 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
1008 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [13, 32],
1009 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
1010 < 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
1011 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { fakeClickEvent(chart.rangeSelector.buttons[chart.highlightedRangeSelectorItemIx].element);
1012 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1013 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1014 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
1015 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
1016 < 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
1017 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
1018 < 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;
1019 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
1020  
1021 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make elements focusable and accessible
1022 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
1023 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(chart.rangeSelector.buttons, function(button) {
1024 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('tabindex', '-1');
1025 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { button.element.setAttribute('role', 'button');
1026 < 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));
1027 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1028 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Focus first/last button
1029 < 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);
1030 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1031 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }),
1032  
1033 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highstock range selector, input boxes
1034 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory('rangeSelectorInput', [
1035 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Tab/Up/Down
1036 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [
1037 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { [9, 38, 40],
1038 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode, e) {
1039 < 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,
1040 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newIx = chart.highlightedInputRangeIx = chart.highlightedInputRangeIx + direction;
1041 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Try to highlight next/prev item in list.
1042 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (newIx > 1 || newIx < 0) { // Out of range
1043 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(direction);
1044 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1045 < 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
1046 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1047 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ]
1048 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ], {
1049 < 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
1050 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
1051 < 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';
1052 < 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;
1053 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
1054  
1055 < 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)
1056 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { transformTabs: false,
1057  
1058 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Highlight first/last input box
1059 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
1060 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightedInputRangeIx = direction > 0 ? 0 : 1;
1061 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.rangeSelector[chart.highlightedInputRangeIx ? 'maxInput' : 'minInput'].focus();
1062 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1063 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }),
1064  
1065 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Legend navigation
1066 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { navModuleFactory('legend', [
1067 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Left/Right/Up/Down
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) { [37, 39, 38, 40],
1070 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function(keyCode) {
1071 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var direction = (keyCode === 37 || keyCode === 38) ? -1 : 1;
1072 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Try to highlight next/prev legend item
1073 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!chart.highlightLegendItem(chart.highlightedLegendItemIx + direction)) {
1074 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return this.move(direction);
1075 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1076 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
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) { // Enter/Spacebar
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) { [13, 32],
1081 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { function() {
1082 < 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);
1083 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
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) { // Only run this module if we have at least one legend - wait for it - item.
1087 < 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.
1088 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Don't run if legend navigation is disabled.
1089 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { validate: function() {
1090 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return chart.legend && chart.legend.allItems &&
1091 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { !(chart.colorAxis && chart.colorAxis.length) &&
1092 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (chart.options.legend &&
1093 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.options.legend.keyboardNavigation &&
1094 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.options.legend.keyboardNavigation.enabled) !== false;
1095 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
1096  
1097 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make elements focusable and accessible
1098 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { init: function(direction) {
1099 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(chart.legend.allItems, function(item) {
1100 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { item.legendGroup.element.setAttribute('tabindex', '-1');
1101 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { item.legendGroup.element.setAttribute('role', 'button');
1102 < 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);
1103 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1104 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Focus first/last item
1105 < 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);
1106 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1107 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { })
1108 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ];
1109  
1110 < 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.
1111 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.keyboardNavigationModuleIndex = 0;
1112  
1113 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make chart reachable by tab
1114 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (
1115 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.container.hasAttribute &&
1116 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { !chart.container.hasAttribute('tabIndex')
1117 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { ) {
1118 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.container.setAttribute('tabindex', '0');
1119 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1120  
1121 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Handle keyboard events
1122 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { addEvent(chart.renderTo, 'keydown', keydownHandler);
1123 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { addEvent(chart, 'destroy', function() {
1124 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { removeEvent(chart.renderTo, 'keydown', keydownHandler);
1125 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1126 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
1127  
1128 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add screen reader region to chart.
1129 < 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.
1130 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.addScreenReaderRegion = function(id, tableId) {
1131 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var chart = this,
1132 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { series = chart.series,
1133 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { options = chart.options,
1134 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { a11yOptions = options.accessibility,
1135 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection = chart.screenReaderRegion = doc.createElement('div'),
1136 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcut = doc.createElement('h4'),
1137 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcutAnchor = doc.createElement('a'),
1138 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chartHeading = doc.createElement('h4'),
1139 < 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
1140 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { position: 'absolute',
1141 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { left: '-9999px',
1142 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { top: 'auto',
1143 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { width: '1px',
1144 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { height: '1px',
1145 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { overflow: 'hidden'
1146 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { },
1147 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chartTypes = chart.types || [],
1148 < 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?)
1149 < 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(),
1150 < 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
1151  
1152 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.setAttribute('id', id);
1153 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.setAttribute('role', 'region');
1154 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.setAttribute('aria-label', 'Chart screen reader information.');
1155  
1156 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.innerHTML = a11yOptions.screenReaderSectionFormatter && a11yOptions.screenReaderSectionFormatter(chart) ||
1157 < 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' +
1158 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (series.length > 1 ? ' and navigate between data series' : '') +
1159 < 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') +
1160 < 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) : '') +
1161 < 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.') +
1162 < 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>' +
1163 < 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 + ' ' +
1164 < 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>' : '') +
1165 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (axesDesc.xAxis ? ('<div>' + axesDesc.xAxis + '</div>') : '') +
1166 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (axesDesc.yAxis ? ('<div>' + axesDesc.yAxis + '</div>') : '');
1167  
1168 < 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
1169 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.getCSV) {
1170 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcutAnchor.innerHTML = 'View as data table.';
1171 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcutAnchor.href = '#' + tableId;
1172 < 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
1173 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcutAnchor.onclick = a11yOptions.onTableAnchorClick || function() {
1174 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.viewData();
1175 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { doc.getElementById(tableId).focus();
1176 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
1177 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableShortcut.appendChild(tableShortcutAnchor);
1178 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSection.appendChild(tableShortcut);
1179 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1180  
1181 < 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
1182 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // h4 element as title for the chart.
1183 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chartHeading.innerHTML = 'Chart graphic.';
1184 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.renderTo.insertBefore(chartHeading, chart.renderTo.firstChild);
1185 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.renderTo.insertBefore(hiddenSection, chart.renderTo.firstChild);
1186  
1187 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Hide the section and the chart heading
1188 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { merge(true, chartHeading.style, hiddenStyle);
1189 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { merge(true, hiddenSection.style, hiddenStyle);
1190 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
1191  
1192  
1193 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make chart container accessible, and wrap table functionality
1194 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.Chart.prototype.callbacks.push(function(chart) {
1195 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var options = chart.options,
1196 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { a11yOptions = options.accessibility;
1197  
1198 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!a11yOptions.enabled) {
1199 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return;
1200 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1201  
1202 < 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'),
1203 < 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'),
1204 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { descElement = chart.container.getElementsByTagName('desc')[0],
1205 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { textElements = chart.container.getElementsByTagName('text'),
1206 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { titleId = 'highcharts-title-' + chart.index,
1207 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { tableId = 'highcharts-data-table-' + chart.index,
1208 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { hiddenSectionId = 'highcharts-information-region-' + chart.index,
1209 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chartTitle = options.title.text || 'Chart',
1210 < 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,
1211 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { topLevelColumns = [];
1212  
1213 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add SVG title/desc tags
1214 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { titleElement.textContent = htmlencode(chartTitle);
1215 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { titleElement.id = titleId;
1216 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { descElement.parentNode.insertBefore(titleElement, descElement);
1217 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.renderTo.setAttribute('role', 'region');
1218 < 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
1219 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.renderTo.setAttribute('aria-label', 'Interactive chart. ' + chartTitle +
1220 < 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.');
1221  
1222 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set screen reader properties on export menu
1223 < 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) {
1224 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var oldExportCallback = chart.exportSVGElements[0].element.onclick,
1225 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { parent = chart.exportSVGElements[0].element.parentNode;
1226 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.exportSVGElements[0].element.onclick = function() {
1227 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { oldExportCallback.apply(this, Array.prototype.slice.call(arguments));
1228 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.addAccessibleContextMenuAttribs();
1229 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.highlightExportItem(0);
1230 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { };
1231 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.exportSVGElements[0].element.setAttribute('role', 'button');
1232 < 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');
1233 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportGroupElement.appendChild(chart.exportSVGElements[0].element);
1234 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportGroupElement.setAttribute('role', 'region');
1235 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { exportGroupElement.setAttribute('aria-label', 'Chart export menu');
1236 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { parent.appendChild(exportGroupElement);
1237 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1238  
1239 < 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
1240 < 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.
1241 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.rangeSelector) {
1242 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(['minInput', 'maxInput'], function(key, i) {
1243 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (chart.rangeSelector[key]) {
1244 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.rangeSelector[key].setAttribute('tabindex', '-1');
1245 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.rangeSelector[key].setAttribute('role', 'textbox');
1246 < 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.');
1247 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1248 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1249 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1250  
1251 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Hide text elements from screen readers
1252 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(textElements, function(el) {
1253 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { el.setAttribute('aria-hidden', 'true');
1254 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1255  
1256 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add top-secret screen reader region
1257 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.addScreenReaderRegion(hiddenSectionId, tableId);
1258  
1259 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Enable keyboard navigation
1260 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (a11yOptions.keyboardNavigation.enabled) {
1261 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { chart.addKeyboardNavEvents();
1262 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1263  
1264 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { /* Wrap table functionality from export-data */
1265  
1266 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Keep track of columns
1267 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { merge(true, options.exporting, {
1268 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { csv: {
1269 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { columnHeaderFormatter: function(item, key, keyLength) {
1270 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!item) {
1271 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return 'Category';
1272 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1273 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (item instanceof H.Axis) {
1274 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return (item.options.title && item.options.title.text) ||
1275 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { (item.isDatetimeAxis ? 'DateTime' : 'Category');
1276 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1277 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var prevCol = topLevelColumns[topLevelColumns.length - 1];
1278 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (keyLength > 1) {
1279 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // We need multiple levels of column headers
1280 < 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
1281 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if ((prevCol && prevCol.text) !== item.name) {
1282 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { topLevelColumns.push({
1283 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { text: item.name,
1284 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { span: keyLength
1285 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1286 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1287 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1288 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (oldColumnHeaderFormatter) {
1289 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return oldColumnHeaderFormatter.call(this, item, key, keyLength);
1290 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1291 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { return keyLength > 1 ? key : item.name;
1292 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1293 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1294 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1295  
1296 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add ID and title/caption to table HTML
1297 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.wrap(chart, 'getTable', function(proceed) {
1298 < 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))
1299 < 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>');
1300 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1301  
1302 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add accessibility attributes and top level columns
1303 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { H.wrap(chart, 'viewData', function(proceed) {
1304 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (!this.dataTableDiv) {
1305 < 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));
1306  
1307 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { var table = doc.getElementById(tableId),
1308 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { head = table.getElementsByTagName('thead')[0],
1309 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { body = table.getElementsByTagName('tbody')[0],
1310 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { firstRow = head.firstChild.children,
1311 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { columnHeaderRow = '<tr><td></td>',
1312 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { cell,
1313 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newCell;
1314  
1315 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Make table focusable by script
1316 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { table.setAttribute('tabindex', '-1');
1317  
1318 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Create row headers
1319 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(body.children, function(el) {
1320 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { cell = el.firstChild;
1321 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newCell = doc.createElement('th');
1322 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newCell.setAttribute('scope', 'row');
1323 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { newCell.innerHTML = cell.innerHTML;
1324 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { cell.parentNode.replaceChild(newCell, cell);
1325 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1326  
1327 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Set scope for column headers
1328 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(firstRow, function(el) {
1329 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (el.tagName === 'TH') {
1330 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { el.setAttribute('scope', 'col');
1331 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1332 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1333  
1334 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { // Add top level columns
1335 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { if (topLevelColumns.length) {
1336 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { each(topLevelColumns, function(col) {
1337 < 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>';
1338 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1339 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { head.insertAdjacentHTML('afterbegin', columnHeaderRow);
1340 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1341 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }
1342 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1343 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { });
1344  
1345 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) { }(Highcharts));
1346 < 0 && newMin < extremes.dataMin) {< extremes.dataMin) {< 0) {< 0) {< 2) {< numXAxes - 1; ++i) {< 2) {< numYAxes - 1; ++i) {}));