corrade-nucleus-nucleons – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 /**
2 * @license Highcharts JS v5.0.10 (2017-03-31)
3 *
4 * 3D features for Highcharts JS
5 *
6 * @license: www.highcharts.com/license
7 */
8 'use strict';
9 (function(factory) {
10 if (typeof module === 'object' && module.exports) {
11 module.exports = factory;
12 } else {
13 factory(Highcharts);
14 }
15 }(function(Highcharts) {
16 (function(H) {
17 /**
18 * (c) 2010-2017 Torstein Honsi
19 *
20 * License: www.highcharts.com/license
21 */
22 /**
23 * Mathematical Functionility
24 */
25 var deg2rad = H.deg2rad,
26 pick = H.pick;
27 /**
28 * Apply 3-D rotation
29 * Euler Angles (XYZ): cosA = cos(Alfa|Roll), cosB = cos(Beta|Pitch), cosG = cos(Gamma|Yaw)
30 *
31 * Composite rotation:
32 * | cosB * cosG | cosB * sinG | -sinB |
33 * | sinA * sinB * cosG - cosA * sinG | sinA * sinB * sinG + cosA * cosG | sinA * cosB |
34 * | cosA * sinB * cosG + sinA * sinG | cosA * sinB * sinG - sinA * cosG | cosA * cosB |
35 *
36 * Now, Gamma/Yaw is not used (angle=0), so we assume cosG = 1 and sinG = 0, so we get:
37 * | cosB | 0 | - sinB |
38 * | sinA * sinB | cosA | sinA * cosB |
39 * | cosA * sinB | - sinA | cosA * cosB |
40 *
41 * But in browsers, y is reversed, so we get sinA => -sinA. The general result is:
42 * | cosB | 0 | - sinB | | x | | px |
43 * | - sinA * sinB | cosA | - sinA * cosB | x | y | = | py |
44 * | cosA * sinB | sinA | cosA * cosB | | z | | pz |
45 */
46 function rotate3D(x, y, z, angles) {
47 return {
48 x: angles.cosB * x - angles.sinB * z,
49 y: -angles.sinA * angles.sinB * x + angles.cosA * y - angles.cosB * angles.sinA * z,
50 z: angles.cosA * angles.sinB * x + angles.sinA * y + angles.cosA * angles.cosB * z
51 };
52 }
53  
54 function perspective3D(coordinate, origin, distance) {
55 var projection = ((distance > 0) && (distance < Number.POSITIVE_INFINITY)) ? distance / (coordinate.z + origin.z + distance) : 1;
56 return {
57 x: coordinate.x * projection,
58 y: coordinate.y * projection
59 };
60 }
61  
62 /**
63 * Transforms a given array of points according to the angles in chart.options.
64 * Parameters:
65 * - points: the array of points
66 * - chart: the chart
67 * - insidePlotArea: wether to verifiy the points are inside the plotArea
68 * Returns:
69 * - an array of transformed points
70 */
71 H.perspective = function(points, chart, insidePlotArea) {
72 var options3d = chart.options.chart.options3d,
73 inverted = insidePlotArea ? chart.inverted : false,
74 origin = {
75 x: chart.plotWidth / 2,
76 y: chart.plotHeight / 2,
77 z: options3d.depth / 2,
78 vd: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0)
79 },
80 scale = chart.scale3d || 1,
81 beta = deg2rad * options3d.beta * (inverted ? -1 : 1),
82 alpha = deg2rad * options3d.alpha * (inverted ? -1 : 1),
83 angles = {
84 cosA: Math.cos(alpha),
85 cosB: Math.cos(-beta),
86 sinA: Math.sin(alpha),
87 sinB: Math.sin(-beta)
88 };
89  
90 if (!insidePlotArea) {
91 origin.x += chart.plotLeft;
92 origin.y += chart.plotTop;
93 }
94  
95 // Transform each point
96 return H.map(points, function(point) {
97 var rotated = rotate3D(
98 (inverted ? point.y : point.x) - origin.x,
99 (inverted ? point.x : point.y) - origin.y,
100 (point.z || 0) - origin.z,
101 angles
102 ),
103 coordinate = perspective3D(rotated, origin, origin.vd); // Apply perspective
104  
105 // Apply translation
106 coordinate.x = coordinate.x * scale + origin.x;
107 coordinate.y = coordinate.y * scale + origin.y;
108 coordinate.z = rotated.z * scale + origin.z;
109  
110 return {
111 x: (inverted ? coordinate.y : coordinate.x),
112 y: (inverted ? coordinate.x : coordinate.y),
113 z: coordinate.z
114 };
115 });
116 };
117  
118 /**
119 * Calculate a distance from camera to points - made for calculating zIndex of scatter points.
120 * Parameters:
121 * - coordinates: The coordinates of the specific point
122 * - chart: the chart
123 * Returns:
124 * - a distance from camera to point
125 */
126 H.pointCameraDistance = function(coordinates, chart) {
127 var options3d = chart.options.chart.options3d,
128 cameraPosition = {
129 x: chart.plotWidth / 2,
130 y: chart.plotHeight / 2,
131 z: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0) + options3d.depth
132 },
133 distance = Math.sqrt(Math.pow(cameraPosition.x - coordinates.plotX, 2) + Math.pow(cameraPosition.y - coordinates.plotY, 2) + Math.pow(cameraPosition.z - coordinates.plotZ, 2));
134 return distance;
135 };
136  
137 }(Highcharts));
138 (function(H) {
139 /**
140 * (c) 2010-2017 Torstein Honsi
141 *
142 * License: www.highcharts.com/license
143 */
144 var cos = Math.cos,
145 PI = Math.PI,
146 sin = Math.sin;
147  
148  
149 var animObject = H.animObject,
150 charts = H.charts,
151 color = H.color,
152 defined = H.defined,
153 deg2rad = H.deg2rad,
154 each = H.each,
155 extend = H.extend,
156 inArray = H.inArray,
157 map = H.map,
158 merge = H.merge,
159 perspective = H.perspective,
160 pick = H.pick,
161 SVGElement = H.SVGElement,
162 SVGRenderer = H.SVGRenderer,
163 wrap = H.wrap;
164 /***
165 EXTENSION TO THE SVG-RENDERER TO ENABLE 3D SHAPES
166 ***/
167 ////// HELPER METHODS //////
168  
169 var dFactor = (4 * (Math.sqrt(2) - 1) / 3) / (PI / 2);
170  
171  
172 //Shoelace algorithm -- http://en.wikipedia.org/wiki/Shoelace_formula
173 function shapeArea(vertexes) {
174 var area = 0,
175 i,
176 j;
177 for (i = 0; i < vertexes.length; i++) {
178 < vertexes.length; i++) { j = (i + 1) % vertexes.length;
179 < vertexes.length; i++) { area += vertexes[i].x * vertexes[j].y - vertexes[j].x * vertexes[i].y;
180 < vertexes.length; i++) { }
181 < vertexes.length; i++) { return area / 2;
182 < vertexes.length; i++) { }
183  
184 < vertexes.length; i++) { function averageZ(vertexes) {
185 < vertexes.length; i++) { var z = 0,
186 < vertexes.length; i++) { i;
187 < vertexes.length; i++) { for (i = 0; i < vertexes.length; i++) {
188 < vertexes.length; i++) { z += vertexes[i].z;
189 < vertexes.length; i++) { }
190 < vertexes.length; i++) { return vertexes.length ? z / vertexes.length : 0;
191 < vertexes.length; i++) { }
192  
193 < vertexes.length; i++) { /** Method to construct a curved path
194 < vertexes.length; i++) { * Can 'wrap' around more then 180 degrees
195 < vertexes.length; i++) { */
196 < vertexes.length; i++) { function curveTo(cx, cy, rx, ry, start, end, dx, dy) {
197 < vertexes.length; i++) { var result = [],
198 < vertexes.length; i++) { arcAngle = end - start;
199 < vertexes.length; i++) { if ((end > start) && (end - start > Math.PI / 2 + 0.0001)) {
200 < vertexes.length; i++) { result = result.concat(curveTo(cx, cy, rx, ry, start, start + (Math.PI / 2), dx, dy));
201 < vertexes.length; i++) { result = result.concat(curveTo(cx, cy, rx, ry, start + (Math.PI / 2), end, dx, dy));
202 < vertexes.length; i++) { return result;
203 < vertexes.length; i++) { }
204 < vertexes.length; i++) { if ((end < start) && (start - end > Math.PI / 2 + 0.0001)) {
205 < vertexes.length; i++) { result = result.concat(curveTo(cx, cy, rx, ry, start, start - (Math.PI / 2), dx, dy));
206 < vertexes.length; i++) { result = result.concat(curveTo(cx, cy, rx, ry, start - (Math.PI / 2), end, dx, dy));
207 < vertexes.length; i++) { return result;
208 < vertexes.length; i++) { }
209 < vertexes.length; i++) { return [
210 < vertexes.length; i++) { 'C',
211 < vertexes.length; i++) { cx + (rx * Math.cos(start)) - ((rx * dFactor * arcAngle) * Math.sin(start)) + dx,
212 < vertexes.length; i++) { cy + (ry * Math.sin(start)) + ((ry * dFactor * arcAngle) * Math.cos(start)) + dy,
213 < vertexes.length; i++) { cx + (rx * Math.cos(end)) + ((rx * dFactor * arcAngle) * Math.sin(end)) + dx,
214 < vertexes.length; i++) { cy + (ry * Math.sin(end)) - ((ry * dFactor * arcAngle) * Math.cos(end)) + dy,
215  
216 < vertexes.length; i++) { cx + (rx * Math.cos(end)) + dx,
217 < vertexes.length; i++) { cy + (ry * Math.sin(end)) + dy
218 < vertexes.length; i++) { ];
219 < vertexes.length; i++) { }
220  
221  
222 < vertexes.length; i++) { /**
223 < vertexes.length; i++) { * Override the SVGRenderer initiator to add definitions used by brighter and
224 < vertexes.length; i++) { * darker faces of the cuboids.
225 < vertexes.length; i++) { */
226 < vertexes.length; i++) { wrap(SVGRenderer.prototype, 'init', function(proceed) {
227 < vertexes.length; i++) { proceed.apply(this, [].slice.call(arguments, 1));
228  
229 < vertexes.length; i++) { each([{
230 < vertexes.length; i++) { name: 'darker',
231 < vertexes.length; i++) { slope: 0.6
232 < vertexes.length; i++) { }, {
233 < vertexes.length; i++) { name: 'brighter',
234 < vertexes.length; i++) { slope: 1.4
235 < vertexes.length; i++) { }], function(cfg) {
236 < vertexes.length; i++) { this.definition({
237 < vertexes.length; i++) { tagName: 'filter',
238 < vertexes.length; i++) { id: 'highcharts-' + cfg.name,
239 < vertexes.length; i++) { children: [{
240 < vertexes.length; i++) { tagName: 'feComponentTransfer',
241 < vertexes.length; i++) { children: [{
242 < vertexes.length; i++) { tagName: 'feFuncR',
243 < vertexes.length; i++) { type: 'linear',
244 < vertexes.length; i++) { slope: cfg.slope
245 < vertexes.length; i++) { }, {
246 < vertexes.length; i++) { tagName: 'feFuncG',
247 < vertexes.length; i++) { type: 'linear',
248 < vertexes.length; i++) { slope: cfg.slope
249 < vertexes.length; i++) { }, {
250 < vertexes.length; i++) { tagName: 'feFuncB',
251 < vertexes.length; i++) { type: 'linear',
252 < vertexes.length; i++) { slope: cfg.slope
253 < vertexes.length; i++) { }]
254 < vertexes.length; i++) { }]
255 < vertexes.length; i++) { });
256 < vertexes.length; i++) { }, this);
257 < vertexes.length; i++) { });
258  
259  
260 < vertexes.length; i++) { SVGRenderer.prototype.toLinePath = function(points, closed) {
261 < vertexes.length; i++) { var result = [];
262  
263 < vertexes.length; i++) { // Put "L x y" for each point
264 < vertexes.length; i++) { each(points, function(point) {
265 < vertexes.length; i++) { result.push('L', point.x, point.y);
266 < vertexes.length; i++) { });
267  
268 < vertexes.length; i++) { if (points.length) {
269 < vertexes.length; i++) { // Set the first element to M
270 < vertexes.length; i++) { result[0] = 'M';
271  
272 < vertexes.length; i++) { // If it is a closed line, add Z
273 < vertexes.length; i++) { if (closed) {
274 < vertexes.length; i++) { result.push('Z');
275 < vertexes.length; i++) { }
276 < vertexes.length; i++) { }
277  
278 < vertexes.length; i++) { return result;
279 < vertexes.length; i++) { };
280  
281 < vertexes.length; i++) { ////// CUBOIDS //////
282 < vertexes.length; i++) { SVGRenderer.prototype.cuboid = function(shapeArgs) {
283  
284 < vertexes.length; i++) { var result = this.g(),
285 < vertexes.length; i++) { destroy = result.destroy,
286 < vertexes.length; i++) { paths = this.cuboidPath(shapeArgs);
287  
288  
289  
290 < vertexes.length; i++) { // create the 3 sides
291 < vertexes.length; i++) { result.front = this.path(paths[0]).attr({
292 < vertexes.length; i++) { 'class': 'highcharts-3d-front',
293 < vertexes.length; i++) { zIndex: paths[3]
294 < vertexes.length; i++) { }).add(result);
295 < vertexes.length; i++) { result.top = this.path(paths[1]).attr({
296 < vertexes.length; i++) { 'class': 'highcharts-3d-top',
297 < vertexes.length; i++) { zIndex: paths[4]
298 < vertexes.length; i++) { }).add(result);
299 < vertexes.length; i++) { result.side = this.path(paths[2]).attr({
300 < vertexes.length; i++) { 'class': 'highcharts-3d-side',
301 < vertexes.length; i++) { zIndex: paths[5]
302 < vertexes.length; i++) { }).add(result);
303  
304 < vertexes.length; i++) { // apply the fill everywhere, the top a bit brighter, the side a bit darker
305 < vertexes.length; i++) { result.fillSetter = function(fill) {
306 < vertexes.length; i++) { this.front.attr({
307 < vertexes.length; i++) { fill: fill
308 < vertexes.length; i++) { });
309 < vertexes.length; i++) { this.top.attr({
310 < vertexes.length; i++) { fill: color(fill).brighten(0.1).get()
311 < vertexes.length; i++) { });
312 < vertexes.length; i++) { this.side.attr({
313 < vertexes.length; i++) { fill: color(fill).brighten(-0.1).get()
314 < vertexes.length; i++) { });
315  
316 < vertexes.length; i++) { this.color = fill;
317 < vertexes.length; i++) { return this;
318 < vertexes.length; i++) { };
319  
320 < vertexes.length; i++) { // apply opacaity everywhere
321 < vertexes.length; i++) { result.opacitySetter = function(opacity) {
322 < vertexes.length; i++) { this.front.attr({
323 < vertexes.length; i++) { opacity: opacity
324 < vertexes.length; i++) { });
325 < vertexes.length; i++) { this.top.attr({
326 < vertexes.length; i++) { opacity: opacity
327 < vertexes.length; i++) { });
328 < vertexes.length; i++) { this.side.attr({
329 < vertexes.length; i++) { opacity: opacity
330 < vertexes.length; i++) { });
331 < vertexes.length; i++) { return this;
332 < vertexes.length; i++) { };
333  
334 < vertexes.length; i++) { result.attr = function(args, val) {
335  
336 < vertexes.length; i++) { // Resolve setting attributes by string name
337 < vertexes.length; i++) { if (typeof args === 'string' && typeof val !== 'undefined') {
338 < vertexes.length; i++) { var key = args;
339 < vertexes.length; i++) { args = {};
340 < vertexes.length; i++) { args[key] = val;
341 < vertexes.length; i++) { }
342  
343 < vertexes.length; i++) { if (args.shapeArgs || defined(args.x)) {
344 < vertexes.length; i++) { var shapeArgs = args.shapeArgs || args;
345 < vertexes.length; i++) { var paths = this.renderer.cuboidPath(shapeArgs);
346 < vertexes.length; i++) { this.front.attr({
347 < vertexes.length; i++) { d: paths[0],
348 < vertexes.length; i++) { zIndex: paths[3]
349 < vertexes.length; i++) { });
350 < vertexes.length; i++) { this.top.attr({
351 < vertexes.length; i++) { d: paths[1],
352 < vertexes.length; i++) { zIndex: paths[4]
353 < vertexes.length; i++) { });
354 < vertexes.length; i++) { this.side.attr({
355 < vertexes.length; i++) { d: paths[2],
356 < vertexes.length; i++) { zIndex: paths[5]
357 < vertexes.length; i++) { });
358 < vertexes.length; i++) { } else {
359 < vertexes.length; i++) { return H.SVGElement.prototype.attr.call(this, args); // getter returns value
360 < vertexes.length; i++) { }
361  
362 < vertexes.length; i++) { return this;
363 < vertexes.length; i++) { };
364  
365 < vertexes.length; i++) { result.animate = function(args, duration, complete) {
366 < vertexes.length; i++) { if (defined(args.x) && defined(args.y)) {
367 < vertexes.length; i++) { var paths = this.renderer.cuboidPath(args);
368 < vertexes.length; i++) { this.front.attr({
369 < vertexes.length; i++) { zIndex: paths[3]
370 < vertexes.length; i++) { }).animate({
371 < vertexes.length; i++) { d: paths[0]
372 < vertexes.length; i++) { }, duration, complete);
373 < vertexes.length; i++) { this.top.attr({
374 < vertexes.length; i++) { zIndex: paths[4]
375 < vertexes.length; i++) { }).animate({
376 < vertexes.length; i++) { d: paths[1]
377 < vertexes.length; i++) { }, duration, complete);
378 < vertexes.length; i++) { this.side.attr({
379 < vertexes.length; i++) { zIndex: paths[5]
380 < vertexes.length; i++) { }).animate({
381 < vertexes.length; i++) { d: paths[2]
382 < vertexes.length; i++) { }, duration, complete);
383 < vertexes.length; i++) { this.attr({
384 < vertexes.length; i++) { zIndex: -paths[6] // #4774
385 < vertexes.length; i++) { });
386 < vertexes.length; i++) { } else if (args.opacity) {
387 < vertexes.length; i++) { this.front.animate(args, duration, complete);
388 < vertexes.length; i++) { this.top.animate(args, duration, complete);
389 < vertexes.length; i++) { this.side.animate(args, duration, complete);
390 < vertexes.length; i++) { } else {
391 < vertexes.length; i++) { SVGElement.prototype.animate.call(this, args, duration, complete);
392 < vertexes.length; i++) { }
393 < vertexes.length; i++) { return this;
394 < vertexes.length; i++) { };
395  
396 < vertexes.length; i++) { // destroy all children
397 < vertexes.length; i++) { result.destroy = function() {
398 < vertexes.length; i++) { this.front.destroy();
399 < vertexes.length; i++) { this.top.destroy();
400 < vertexes.length; i++) { this.side.destroy();
401  
402 < vertexes.length; i++) { return destroy.call(this);
403 < vertexes.length; i++) { };
404  
405 < vertexes.length; i++) { // Apply the Z index to the cuboid group
406 < vertexes.length; i++) { result.attr({
407 < vertexes.length; i++) { zIndex: -paths[6]
408 < vertexes.length; i++) { });
409  
410 < vertexes.length; i++) { return result;
411 < vertexes.length; i++) { };
412  
413 < vertexes.length; i++) { /**
414 < vertexes.length; i++) { * Generates a cuboid
415 < vertexes.length; i++) { */
416 < vertexes.length; i++) { SVGRenderer.prototype.cuboidPath = function(shapeArgs) {
417 < vertexes.length; i++) { var x = shapeArgs.x,
418 < vertexes.length; i++) { y = shapeArgs.y,
419 < vertexes.length; i++) { z = shapeArgs.z,
420 < vertexes.length; i++) { h = shapeArgs.height,
421 < vertexes.length; i++) { w = shapeArgs.width,
422 < vertexes.length; i++) { d = shapeArgs.depth,
423 < vertexes.length; i++) { chart = charts[this.chartIndex];
424  
425 < vertexes.length; i++) { // The 8 corners of the cube
426 < vertexes.length; i++) { var pArr = [{
427 < vertexes.length; i++) { x: x,
428 < vertexes.length; i++) { y: y,
429 < vertexes.length; i++) { z: z
430 < vertexes.length; i++) { },
431 < vertexes.length; i++) { {
432 < vertexes.length; i++) { x: x + w,
433 < vertexes.length; i++) { y: y,
434 < vertexes.length; i++) { z: z
435 < vertexes.length; i++) { },
436 < vertexes.length; i++) { {
437 < vertexes.length; i++) { x: x + w,
438 < vertexes.length; i++) { y: y + h,
439 < vertexes.length; i++) { z: z
440 < vertexes.length; i++) { },
441 < vertexes.length; i++) { {
442 < vertexes.length; i++) { x: x,
443 < vertexes.length; i++) { y: y + h,
444 < vertexes.length; i++) { z: z
445 < vertexes.length; i++) { },
446 < vertexes.length; i++) { {
447 < vertexes.length; i++) { x: x,
448 < vertexes.length; i++) { y: y + h,
449 < vertexes.length; i++) { z: z + d
450 < vertexes.length; i++) { },
451 < vertexes.length; i++) { {
452 < vertexes.length; i++) { x: x + w,
453 < vertexes.length; i++) { y: y + h,
454 < vertexes.length; i++) { z: z + d
455 < vertexes.length; i++) { },
456 < vertexes.length; i++) { {
457 < vertexes.length; i++) { x: x + w,
458 < vertexes.length; i++) { y: y,
459 < vertexes.length; i++) { z: z + d
460 < vertexes.length; i++) { },
461 < vertexes.length; i++) { {
462 < vertexes.length; i++) { x: x,
463 < vertexes.length; i++) { y: y,
464 < vertexes.length; i++) { z: z + d
465 < vertexes.length; i++) { }
466 < vertexes.length; i++) { ];
467  
468 < vertexes.length; i++) { // apply perspective
469 < vertexes.length; i++) { pArr = perspective(pArr, chart, shapeArgs.insidePlotArea);
470  
471 < vertexes.length; i++) { // helper method to decide which side is visible
472 < vertexes.length; i++) { function mapPath(i) {
473 < vertexes.length; i++) { return pArr[i];
474 < vertexes.length; i++) { }
475 < vertexes.length; i++) { var pickShape = function(path1, path2) {
476 < vertexes.length; i++) { var ret = [];
477 < vertexes.length; i++) { path1 = map(path1, mapPath);
478 < vertexes.length; i++) { path2 = map(path2, mapPath);
479 < vertexes.length; i++) { if (shapeArea(path1) < 0) {
480 < vertexes.length; i++) { ret = path1;
481 < vertexes.length; i++) { } else if (shapeArea(path2) < 0) {
482 < vertexes.length; i++) { ret = path2;
483 < vertexes.length; i++) { }
484 < vertexes.length; i++) { return ret;
485 < vertexes.length; i++) { };
486  
487 < vertexes.length; i++) { // front or back
488 < vertexes.length; i++) { var front = [3, 2, 1, 0];
489 < vertexes.length; i++) { var back = [7, 6, 5, 4];
490 < vertexes.length; i++) { var path1 = pickShape(front, back);
491  
492 < vertexes.length; i++) { // top or bottom
493 < vertexes.length; i++) { var top = [1, 6, 7, 0];
494 < vertexes.length; i++) { var bottom = [4, 5, 2, 3];
495 < vertexes.length; i++) { var path2 = pickShape(top, bottom);
496  
497 < vertexes.length; i++) { // side
498 < vertexes.length; i++) { var right = [1, 2, 5, 6];
499 < vertexes.length; i++) { var left = [0, 7, 4, 3];
500 < vertexes.length; i++) { var path3 = pickShape(right, left);
501  
502 < vertexes.length; i++) { return [this.toLinePath(path1, true), this.toLinePath(path2, true), this.toLinePath(path3, true), averageZ(path1), averageZ(path2), averageZ(path3), averageZ(map(bottom, mapPath)) * 9e9]; // #4774
503 < vertexes.length; i++) { };
504  
505 < vertexes.length; i++) { ////// SECTORS //////
506 < vertexes.length; i++) { H.SVGRenderer.prototype.arc3d = function(attribs) {
507  
508 < vertexes.length; i++) { var wrapper = this.g(),
509 < vertexes.length; i++) { renderer = wrapper.renderer,
510 < vertexes.length; i++) { customAttribs = ['x', 'y', 'r', 'innerR', 'start', 'end'];
511  
512 < vertexes.length; i++) { /**
513 < vertexes.length; i++) { * Get custom attributes. Don't mutate the original object and return an object with only custom attr.
514 < vertexes.length; i++) { */
515 < vertexes.length; i++) { function suckOutCustom(params) {
516 < vertexes.length; i++) { var hasCA = false,
517 < vertexes.length; i++) { ca = {};
518  
519 < vertexes.length; i++) { params = merge(params); // Don't mutate the original object
520  
521 < vertexes.length; i++) { for (var key in params) {
522 < vertexes.length; i++) { if (inArray(key, customAttribs) !== -1) {
523 < vertexes.length; i++) { ca[key] = params[key];
524 < vertexes.length; i++) { delete params[key];
525 < vertexes.length; i++) { hasCA = true;
526 < vertexes.length; i++) { }
527 < vertexes.length; i++) { }
528 < vertexes.length; i++) { return hasCA ? ca : false;
529 < vertexes.length; i++) { }
530  
531 < vertexes.length; i++) { attribs = merge(attribs);
532  
533 < vertexes.length; i++) { attribs.alpha *= deg2rad;
534 < vertexes.length; i++) { attribs.beta *= deg2rad;
535  
536 < vertexes.length; i++) { // Create the different sub sections of the shape
537 < vertexes.length; i++) { wrapper.top = renderer.path();
538 < vertexes.length; i++) { wrapper.side1 = renderer.path();
539 < vertexes.length; i++) { wrapper.side2 = renderer.path();
540 < vertexes.length; i++) { wrapper.inn = renderer.path();
541 < vertexes.length; i++) { wrapper.out = renderer.path();
542  
543 < vertexes.length; i++) { /**
544 < vertexes.length; i++) { * Add all faces
545 < vertexes.length; i++) { */
546 < vertexes.length; i++) { wrapper.onAdd = function() {
547 < vertexes.length; i++) { var parent = wrapper.parentGroup,
548 < vertexes.length; i++) { className = wrapper.attr('class');
549 < vertexes.length; i++) { wrapper.top.add(wrapper);
550  
551 < vertexes.length; i++) { // These faces are added outside the wrapper group because the z index
552 < vertexes.length; i++) { // relates to neighbour elements as well
553 < vertexes.length; i++) { each(['out', 'inn', 'side1', 'side2'], function(face) {
554 < vertexes.length; i++) { wrapper[face]
555 < vertexes.length; i++) { .addClass(className + ' highcharts-3d-side')
556 < vertexes.length; i++) { .add(parent);
557 < vertexes.length; i++) { });
558 < vertexes.length; i++) { };
559  
560 < vertexes.length; i++) { /**
561 < vertexes.length; i++) { * Compute the transformed paths and set them to the composite shapes
562 < vertexes.length; i++) { */
563 < vertexes.length; i++) { wrapper.setPaths = function(attribs) {
564  
565 < vertexes.length; i++) { var paths = wrapper.renderer.arc3dPath(attribs),
566 < vertexes.length; i++) { zIndex = paths.zTop * 100;
567  
568 < vertexes.length; i++) { wrapper.attribs = attribs;
569  
570 < vertexes.length; i++) { wrapper.top.attr({
571 < vertexes.length; i++) { d: paths.top,
572 < vertexes.length; i++) { zIndex: paths.zTop
573 < vertexes.length; i++) { });
574 < vertexes.length; i++) { wrapper.inn.attr({
575 < vertexes.length; i++) { d: paths.inn,
576 < vertexes.length; i++) { zIndex: paths.zInn
577 < vertexes.length; i++) { });
578 < vertexes.length; i++) { wrapper.out.attr({
579 < vertexes.length; i++) { d: paths.out,
580 < vertexes.length; i++) { zIndex: paths.zOut
581 < vertexes.length; i++) { });
582 < vertexes.length; i++) { wrapper.side1.attr({
583 < vertexes.length; i++) { d: paths.side1,
584 < vertexes.length; i++) { zIndex: paths.zSide1
585 < vertexes.length; i++) { });
586 < vertexes.length; i++) { wrapper.side2.attr({
587 < vertexes.length; i++) { d: paths.side2,
588 < vertexes.length; i++) { zIndex: paths.zSide2
589 < vertexes.length; i++) { });
590  
591  
592 < vertexes.length; i++) { // show all children
593 < vertexes.length; i++) { wrapper.zIndex = zIndex;
594 < vertexes.length; i++) { wrapper.attr({
595 < vertexes.length; i++) { zIndex: zIndex
596 < vertexes.length; i++) { });
597  
598 < vertexes.length; i++) { // Set the radial gradient center the first time
599 < vertexes.length; i++) { if (attribs.center) {
600 < vertexes.length; i++) { wrapper.top.setRadialReference(attribs.center);
601 < vertexes.length; i++) { delete attribs.center;
602 < vertexes.length; i++) { }
603 < vertexes.length; i++) { };
604 < vertexes.length; i++) { wrapper.setPaths(attribs);
605  
606 < vertexes.length; i++) { // Apply the fill to the top and a darker shade to the sides
607 < vertexes.length; i++) { wrapper.fillSetter = function(value) {
608 < vertexes.length; i++) { var darker = color(value).brighten(-0.1).get();
609  
610 < vertexes.length; i++) { this.fill = value;
611  
612 < vertexes.length; i++) { this.side1.attr({
613 < vertexes.length; i++) { fill: darker
614 < vertexes.length; i++) { });
615 < vertexes.length; i++) { this.side2.attr({
616 < vertexes.length; i++) { fill: darker
617 < vertexes.length; i++) { });
618 < vertexes.length; i++) { this.inn.attr({
619 < vertexes.length; i++) { fill: darker
620 < vertexes.length; i++) { });
621 < vertexes.length; i++) { this.out.attr({
622 < vertexes.length; i++) { fill: darker
623 < vertexes.length; i++) { });
624 < vertexes.length; i++) { this.top.attr({
625 < vertexes.length; i++) { fill: value
626 < vertexes.length; i++) { });
627 < vertexes.length; i++) { return this;
628 < vertexes.length; i++) { };
629  
630 < vertexes.length; i++) { // Apply the same value to all. These properties cascade down to the children
631 < vertexes.length; i++) { // when set to the composite arc3d.
632 < vertexes.length; i++) { each(['opacity', 'translateX', 'translateY', 'visibility'], function(setter) {
633 < vertexes.length; i++) { wrapper[setter + 'Setter'] = function(value, key) {
634 < vertexes.length; i++) { wrapper[key] = value;
635 < vertexes.length; i++) { each(['out', 'inn', 'side1', 'side2', 'top'], function(el) {
636 < vertexes.length; i++) { wrapper[el].attr(key, value);
637 < vertexes.length; i++) { });
638 < vertexes.length; i++) { };
639 < vertexes.length; i++) { });
640  
641 < vertexes.length; i++) { /**
642 < vertexes.length; i++) { * Override attr to remove shape attributes and use those to set child paths
643 < vertexes.length; i++) { */
644 < vertexes.length; i++) { wrap(wrapper, 'attr', function(proceed, params) {
645 < vertexes.length; i++) { var ca;
646 < vertexes.length; i++) { if (typeof params === 'object') {
647 < vertexes.length; i++) { ca = suckOutCustom(params);
648 < vertexes.length; i++) { if (ca) {
649 < vertexes.length; i++) { extend(wrapper.attribs, ca);
650 < vertexes.length; i++) { wrapper.setPaths(wrapper.attribs);
651 < vertexes.length; i++) { }
652 < vertexes.length; i++) { }
653 < vertexes.length; i++) { return proceed.apply(this, [].slice.call(arguments, 1));
654 < vertexes.length; i++) { });
655  
656 < vertexes.length; i++) { /**
657 < vertexes.length; i++) { * Override the animate function by sucking out custom parameters related to the shapes directly,
658 < vertexes.length; i++) { * and update the shapes from the animation step.
659 < vertexes.length; i++) { */
660 < vertexes.length; i++) { wrap(wrapper, 'animate', function(proceed, params, animation, complete) {
661 < vertexes.length; i++) { var ca,
662 < vertexes.length; i++) { from = this.attribs,
663 < vertexes.length; i++) { to,
664 < vertexes.length; i++) { anim;
665  
666 < vertexes.length; i++) { // Attribute-line properties connected to 3D. These shouldn't have been in the
667 < vertexes.length; i++) { // attribs collection in the first place.
668 < vertexes.length; i++) { delete params.center;
669 < vertexes.length; i++) { delete params.z;
670 < vertexes.length; i++) { delete params.depth;
671 < vertexes.length; i++) { delete params.alpha;
672 < vertexes.length; i++) { delete params.beta;
673  
674 < vertexes.length; i++) { anim = animObject(pick(animation, this.renderer.globalAnimation));
675  
676 < vertexes.length; i++) { if (anim.duration) {
677 < vertexes.length; i++) { ca = suckOutCustom(params);
678 < vertexes.length; i++) { params.dummy = 1; // Params need to have a property in order for the step to run (#5765)
679  
680 < vertexes.length; i++) { if (ca) {
681 < vertexes.length; i++) { to = ca;
682 < vertexes.length; i++) { anim.step = function(a, fx) {
683 < vertexes.length; i++) { function interpolate(key) {
684 < vertexes.length; i++) { return from[key] + (pick(to[key], from[key]) - from[key]) * fx.pos;
685 < vertexes.length; i++) { }
686  
687 < vertexes.length; i++) { if (fx.prop === 'dummy') {
688 < vertexes.length; i++) { fx.elem.setPaths(merge(from, {
689 < vertexes.length; i++) { x: interpolate('x'),
690 < vertexes.length; i++) { y: interpolate('y'),
691 < vertexes.length; i++) { r: interpolate('r'),
692 < vertexes.length; i++) { innerR: interpolate('innerR'),
693 < vertexes.length; i++) { start: interpolate('start'),
694 < vertexes.length; i++) { end: interpolate('end')
695 < vertexes.length; i++) { }));
696 < vertexes.length; i++) { }
697 < vertexes.length; i++) { };
698 < vertexes.length; i++) { }
699 < vertexes.length; i++) { animation = anim; // Only when duration (#5572)
700 < vertexes.length; i++) { }
701 < vertexes.length; i++) { return proceed.call(this, params, animation, complete);
702 < vertexes.length; i++) { });
703  
704 < vertexes.length; i++) { // destroy all children
705 < vertexes.length; i++) { wrapper.destroy = function() {
706 < vertexes.length; i++) { this.top.destroy();
707 < vertexes.length; i++) { this.out.destroy();
708 < vertexes.length; i++) { this.inn.destroy();
709 < vertexes.length; i++) { this.side1.destroy();
710 < vertexes.length; i++) { this.side2.destroy();
711  
712 < vertexes.length; i++) { SVGElement.prototype.destroy.call(this);
713 < vertexes.length; i++) { };
714 < vertexes.length; i++) { // hide all children
715 < vertexes.length; i++) { wrapper.hide = function() {
716 < vertexes.length; i++) { this.top.hide();
717 < vertexes.length; i++) { this.out.hide();
718 < vertexes.length; i++) { this.inn.hide();
719 < vertexes.length; i++) { this.side1.hide();
720 < vertexes.length; i++) { this.side2.hide();
721 < vertexes.length; i++) { };
722 < vertexes.length; i++) { wrapper.show = function() {
723 < vertexes.length; i++) { this.top.show();
724 < vertexes.length; i++) { this.out.show();
725 < vertexes.length; i++) { this.inn.show();
726 < vertexes.length; i++) { this.side1.show();
727 < vertexes.length; i++) { this.side2.show();
728 < vertexes.length; i++) { };
729 < vertexes.length; i++) { return wrapper;
730 < vertexes.length; i++) { };
731  
732 < vertexes.length; i++) { /**
733 < vertexes.length; i++) { * Generate the paths required to draw a 3D arc
734 < vertexes.length; i++) { */
735 < vertexes.length; i++) { SVGRenderer.prototype.arc3dPath = function(shapeArgs) {
736 < vertexes.length; i++) { var cx = shapeArgs.x, // x coordinate of the center
737 < vertexes.length; i++) { cy = shapeArgs.y, // y coordinate of the center
738 < vertexes.length; i++) { start = shapeArgs.start, // start angle
739 < vertexes.length; i++) { end = shapeArgs.end - 0.00001, // end angle
740 < vertexes.length; i++) { r = shapeArgs.r, // radius
741 < vertexes.length; i++) { ir = shapeArgs.innerR, // inner radius
742 < vertexes.length; i++) { d = shapeArgs.depth, // depth
743 < vertexes.length; i++) { alpha = shapeArgs.alpha, // alpha rotation of the chart
744 < vertexes.length; i++) { beta = shapeArgs.beta; // beta rotation of the chart
745  
746 < vertexes.length; i++) { // Derived Variables
747 < vertexes.length; i++) { var cs = Math.cos(start), // cosinus of the start angle
748 < vertexes.length; i++) { ss = Math.sin(start), // sinus of the start angle
749 < vertexes.length; i++) { ce = Math.cos(end), // cosinus of the end angle
750 < vertexes.length; i++) { se = Math.sin(end), // sinus of the end angle
751 < vertexes.length; i++) { rx = r * Math.cos(beta), // x-radius
752 < vertexes.length; i++) { ry = r * Math.cos(alpha), // y-radius
753 < vertexes.length; i++) { irx = ir * Math.cos(beta), // x-radius (inner)
754 < vertexes.length; i++) { iry = ir * Math.cos(alpha), // y-radius (inner)
755 < vertexes.length; i++) { dx = d * Math.sin(beta), // distance between top and bottom in x
756 < vertexes.length; i++) { dy = d * Math.sin(alpha); // distance between top and bottom in y
757  
758 < vertexes.length; i++) { // TOP
759 < vertexes.length; i++) { var top = ['M', cx + (rx * cs), cy + (ry * ss)];
760 < vertexes.length; i++) { top = top.concat(curveTo(cx, cy, rx, ry, start, end, 0, 0));
761 < vertexes.length; i++) { top = top.concat([
762 < vertexes.length; i++) { 'L', cx + (irx * ce), cy + (iry * se)
763 < vertexes.length; i++) { ]);
764 < vertexes.length; i++) { top = top.concat(curveTo(cx, cy, irx, iry, end, start, 0, 0));
765 < vertexes.length; i++) { top = top.concat(['Z']);
766 < vertexes.length; i++) { // OUTSIDE
767 < vertexes.length; i++) { var b = (beta > 0 ? Math.PI / 2 : 0),
768 < vertexes.length; i++) { a = (alpha > 0 ? 0 : Math.PI / 2);
769  
770 < vertexes.length; i++) { var start2 = start > -b ? start : (end > -b ? -b : start),
771 < vertexes.length; i++) { end2 = end < PI - a ? end : (start < PI - a ? PI - a : end),
772 < vertexes.length; i++) { midEnd = 2 * PI - a;
773  
774 < vertexes.length; i++) { // When slice goes over bottom middle, need to add both, left and right outer side.
775 < vertexes.length; i++) { // Additionally, when we cross right hand edge, create sharp edge. Outer shape/wall:
776 < vertexes.length; i++) { //
777 < vertexes.length; i++) { // -------
778 < vertexes.length; i++) { // / ^ \
779 < vertexes.length; i++) { // 4) / / \ \ 1)
780 < vertexes.length; i++) { // / / \ \
781 < vertexes.length; i++) { // / / \ \
782 < vertexes.length; i++) { // (c)=> ==== ==== <=(d)
783 < vertexes.length; i++) { // \ \ / /
784 < vertexes.length; i++) { // \ \<=(a)/ /
785 < vertexes.length; i++) { // \ \ / / <=(b)
786 < vertexes.length; i++) { // 3) \ v / 2)
787 < vertexes.length; i++) { // -------
788 < vertexes.length; i++) { //
789 < vertexes.length; i++) { // (a) - inner side
790 < vertexes.length; i++) { // (b) - outer side
791 < vertexes.length; i++) { // (c) - left edge (sharp)
792 < vertexes.length; i++) { // (d) - right edge (sharp)
793 < vertexes.length; i++) { // 1..n - rendering order for startAngle = 0, when set to e.g 90, order changes clockwise (1->2, 2->3, n->1) and counterclockwise for negative startAngle
794  
795 < vertexes.length; i++) { var out = ['M', cx + (rx * cos(start2)), cy + (ry * sin(start2))];
796 < vertexes.length; i++) { out = out.concat(curveTo(cx, cy, rx, ry, start2, end2, 0, 0));
797  
798 < vertexes.length; i++) { if (end > midEnd && start < midEnd) { // When shape is wide, it can cross both, (c) and (d) edges, when using startAngle
799 < vertexes.length; i++) { // Go to outer side
800 < vertexes.length; i++) { out = out.concat([
801 < vertexes.length; i++) { 'L', cx + (rx * cos(end2)) + dx, cy + (ry * sin(end2)) + dy
802 < vertexes.length; i++) { ]);
803 < vertexes.length; i++) { // Curve to the right edge of the slice (d)
804 < vertexes.length; i++) { out = out.concat(curveTo(cx, cy, rx, ry, end2, midEnd, dx, dy));
805 < vertexes.length; i++) { // Go to the inner side
806 < vertexes.length; i++) { out = out.concat([
807 < vertexes.length; i++) { 'L', cx + (rx * cos(midEnd)), cy + (ry * sin(midEnd))
808 < vertexes.length; i++) { ]);
809 < vertexes.length; i++) { // Curve to the true end of the slice
810 < vertexes.length; i++) { out = out.concat(curveTo(cx, cy, rx, ry, midEnd, end, 0, 0));
811 < vertexes.length; i++) { // Go to the outer side
812 < vertexes.length; i++) { out = out.concat([
813 < vertexes.length; i++) { 'L', cx + (rx * cos(end)) + dx, cy + (ry * sin(end)) + dy
814 < vertexes.length; i++) { ]);
815 < vertexes.length; i++) { // Go back to middle (d)
816 < vertexes.length; i++) { out = out.concat(curveTo(cx, cy, rx, ry, end, midEnd, dx, dy));
817 < vertexes.length; i++) { out = out.concat([
818 < vertexes.length; i++) { 'L', cx + (rx * cos(midEnd)), cy + (ry * sin(midEnd))
819 < vertexes.length; i++) { ]);
820 < vertexes.length; i++) { // Go back to the left edge
821 < vertexes.length; i++) { out = out.concat(curveTo(cx, cy, rx, ry, midEnd, end2, 0, 0));
822 < vertexes.length; i++) { } else if (end > PI - a && start < PI - a) { // But shape can cross also only (c) edge:
823 < vertexes.length; i++) { // Go to outer side
824 < vertexes.length; i++) { out = out.concat([
825 < vertexes.length; i++) { 'L', cx + (rx * Math.cos(end2)) + dx, cy + (ry * Math.sin(end2)) + dy
826 < vertexes.length; i++) { ]);
827 < vertexes.length; i++) { // Curve to the true end of the slice
828 < vertexes.length; i++) { out = out.concat(curveTo(cx, cy, rx, ry, end2, end, dx, dy));
829 < vertexes.length; i++) { // Go to the inner side
830 < vertexes.length; i++) { out = out.concat([
831 < vertexes.length; i++) { 'L', cx + (rx * Math.cos(end)), cy + (ry * Math.sin(end))
832 < vertexes.length; i++) { ]);
833 < vertexes.length; i++) { // Go back to the artifical end2
834 < vertexes.length; i++) { out = out.concat(curveTo(cx, cy, rx, ry, end, end2, 0, 0));
835 < vertexes.length; i++) { }
836  
837 < vertexes.length; i++) { out = out.concat([
838 < vertexes.length; i++) { 'L', cx + (rx * Math.cos(end2)) + dx, cy + (ry * Math.sin(end2)) + dy
839 < vertexes.length; i++) { ]);
840 < vertexes.length; i++) { out = out.concat(curveTo(cx, cy, rx, ry, end2, start2, dx, dy));
841 < vertexes.length; i++) { out = out.concat(['Z']);
842  
843 < vertexes.length; i++) { // INSIDE
844 < vertexes.length; i++) { var inn = ['M', cx + (irx * cs), cy + (iry * ss)];
845 < vertexes.length; i++) { inn = inn.concat(curveTo(cx, cy, irx, iry, start, end, 0, 0));
846 < vertexes.length; i++) { inn = inn.concat([
847 < vertexes.length; i++) { 'L', cx + (irx * Math.cos(end)) + dx, cy + (iry * Math.sin(end)) + dy
848 < vertexes.length; i++) { ]);
849 < vertexes.length; i++) { inn = inn.concat(curveTo(cx, cy, irx, iry, end, start, dx, dy));
850 < vertexes.length; i++) { inn = inn.concat(['Z']);
851  
852 < vertexes.length; i++) { // SIDES
853 < vertexes.length; i++) { var side1 = [
854 < vertexes.length; i++) { 'M', cx + (rx * cs), cy + (ry * ss),
855 < vertexes.length; i++) { 'L', cx + (rx * cs) + dx, cy + (ry * ss) + dy,
856 < vertexes.length; i++) { 'L', cx + (irx * cs) + dx, cy + (iry * ss) + dy,
857 < vertexes.length; i++) { 'L', cx + (irx * cs), cy + (iry * ss),
858 < vertexes.length; i++) { 'Z'
859 < vertexes.length; i++) { ];
860 < vertexes.length; i++) { var side2 = [
861 < vertexes.length; i++) { 'M', cx + (rx * ce), cy + (ry * se),
862 < vertexes.length; i++) { 'L', cx + (rx * ce) + dx, cy + (ry * se) + dy,
863 < vertexes.length; i++) { 'L', cx + (irx * ce) + dx, cy + (iry * se) + dy,
864 < vertexes.length; i++) { 'L', cx + (irx * ce), cy + (iry * se),
865 < vertexes.length; i++) { 'Z'
866 < vertexes.length; i++) { ];
867  
868 < vertexes.length; i++) { // correction for changed position of vanishing point caused by alpha and beta rotations
869 < vertexes.length; i++) { var angleCorr = Math.atan2(dy, -dx),
870 < vertexes.length; i++) { angleEnd = Math.abs(end + angleCorr),
871 < vertexes.length; i++) { angleStart = Math.abs(start + angleCorr),
872 < vertexes.length; i++) { angleMid = Math.abs((start + end) / 2 + angleCorr);
873  
874 < vertexes.length; i++) { // set to 0-PI range
875 < vertexes.length; i++) { function toZeroPIRange(angle) {
876 < vertexes.length; i++) { angle = angle % (2 * Math.PI);
877 < vertexes.length; i++) { if (angle > Math.PI) {
878 < vertexes.length; i++) { angle = 2 * Math.PI - angle;
879 < vertexes.length; i++) { }
880 < vertexes.length; i++) { return angle;
881 < vertexes.length; i++) { }
882 < vertexes.length; i++) { angleEnd = toZeroPIRange(angleEnd);
883 < vertexes.length; i++) { angleStart = toZeroPIRange(angleStart);
884 < vertexes.length; i++) { angleMid = toZeroPIRange(angleMid);
885  
886 < vertexes.length; i++) { // *1e5 is to compensate pInt in zIndexSetter
887 < vertexes.length; i++) { var incPrecision = 1e5,
888 < vertexes.length; i++) { a1 = angleMid * incPrecision,
889 < vertexes.length; i++) { a2 = angleStart * incPrecision,
890 < vertexes.length; i++) { a3 = angleEnd * incPrecision;
891  
892 < vertexes.length; i++) { return {
893 < vertexes.length; i++) { top: top,
894 < vertexes.length; i++) { zTop: Math.PI * incPrecision + 1, // max angle is PI, so this is allways higher
895 < vertexes.length; i++) { out: out,
896 < vertexes.length; i++) { zOut: Math.max(a1, a2, a3),
897 < vertexes.length; i++) { inn: inn,
898 < vertexes.length; i++) { zInn: Math.max(a1, a2, a3),
899 < vertexes.length; i++) { side1: side1,
900 < vertexes.length; i++) { zSide1: a3 * 0.99, // to keep below zOut and zInn in case of same values
901 < vertexes.length; i++) { side2: side2,
902 < vertexes.length; i++) { zSide2: a2 * 0.99
903 < vertexes.length; i++) { };
904 < vertexes.length; i++) { };
905  
906 < vertexes.length; i++) { }(Highcharts));
907 < vertexes.length; i++) { (function(H) {
908 < vertexes.length; i++) { /**
909 < vertexes.length; i++) { * (c) 2010-2017 Torstein Honsi
910 < vertexes.length; i++) { *
911 < vertexes.length; i++) { * License: www.highcharts.com/license
912 < vertexes.length; i++) { */
913 < vertexes.length; i++) { var Chart = H.Chart,
914 < vertexes.length; i++) { each = H.each,
915 < vertexes.length; i++) { merge = H.merge,
916 < vertexes.length; i++) { perspective = H.perspective,
917 < vertexes.length; i++) { pick = H.pick,
918 < vertexes.length; i++) { wrap = H.wrap;
919  
920 < vertexes.length; i++) { /***
921 < vertexes.length; i++) { EXTENSION FOR 3D CHARTS
922 < vertexes.length; i++) { ***/
923 < vertexes.length; i++) { // Shorthand to check the is3d flag
924 < vertexes.length; i++) { Chart.prototype.is3d = function() {
925 < vertexes.length; i++) { return this.options.chart.options3d && this.options.chart.options3d.enabled; // #4280
926 < vertexes.length; i++) { };
927  
928 < vertexes.length; i++) { Chart.prototype.propsRequireDirtyBox.push('chart.options3d');
929 < vertexes.length; i++) { Chart.prototype.propsRequireUpdateSeries.push('chart.options3d');
930  
931 < vertexes.length; i++) { /**
932 < vertexes.length; i++) { * Calculate scale of the 3D view. That is required to
933 < vertexes.length; i++) { * fit chart's 3D projection into the actual plotting area. Reported as #4933.
934 < vertexes.length; i++) { * @notice This function should ideally take the plot values instead of a chart object,
935 < vertexes.length; i++) { * but since the chart object is needed for perspective it is not practical.
936 < vertexes.length; i++) { * Possible to make both getScale and perspective more logical and also immutable.
937 < vertexes.length; i++) { * @param {Object} chart Chart object
938 < vertexes.length; i++) { * @param {Number} chart.plotLeft
939 < vertexes.length; i++) { * @param {Number} chart.plotWidth
940 < vertexes.length; i++) { * @param {Number} chart.plotTop
941 < vertexes.length; i++) { * @param {Number} chart.plotHeight
942 < vertexes.length; i++) { * @param {Number} depth The depth of the chart
943 < vertexes.length; i++) { * @return {Number} The scale to fit the 3D chart into the plotting area.
944 < vertexes.length; i++) { */
945 < vertexes.length; i++) { function getScale(chart, depth) {
946 < vertexes.length; i++) { var plotLeft = chart.plotLeft,
947 < vertexes.length; i++) { plotRight = chart.plotWidth + plotLeft,
948 < vertexes.length; i++) { plotTop = chart.plotTop,
949 < vertexes.length; i++) { plotBottom = chart.plotHeight + plotTop,
950 < vertexes.length; i++) { originX = plotLeft + chart.plotWidth / 2,
951 < vertexes.length; i++) { originY = plotTop + chart.plotHeight / 2,
952 < vertexes.length; i++) { bbox3d = {
953 < vertexes.length; i++) { minX: Number.MAX_VALUE,
954 < vertexes.length; i++) { maxX: -Number.MAX_VALUE,
955 < vertexes.length; i++) { minY: Number.MAX_VALUE,
956 < vertexes.length; i++) { maxY: -Number.MAX_VALUE
957 < vertexes.length; i++) { },
958 < vertexes.length; i++) { corners,
959 < vertexes.length; i++) { scale = 1;
960  
961 < vertexes.length; i++) { // Top left corners:
962 < vertexes.length; i++) { corners = [{
963 < vertexes.length; i++) { x: plotLeft,
964 < vertexes.length; i++) { y: plotTop,
965 < vertexes.length; i++) { z: 0
966 < vertexes.length; i++) { }, {
967 < vertexes.length; i++) { x: plotLeft,
968 < vertexes.length; i++) { y: plotTop,
969 < vertexes.length; i++) { z: depth
970 < vertexes.length; i++) { }];
971  
972 < vertexes.length; i++) { // Top right corners:
973 < vertexes.length; i++) { each([0, 1], function(i) {
974 < vertexes.length; i++) { corners.push({
975 < vertexes.length; i++) { x: plotRight,
976 < vertexes.length; i++) { y: corners[i].y,
977 < vertexes.length; i++) { z: corners[i].z
978 < vertexes.length; i++) { });
979 < vertexes.length; i++) { });
980  
981 < vertexes.length; i++) { // All bottom corners:
982 < vertexes.length; i++) { each([0, 1, 2, 3], function(i) {
983 < vertexes.length; i++) { corners.push({
984 < vertexes.length; i++) { x: corners[i].x,
985 < vertexes.length; i++) { y: plotBottom,
986 < vertexes.length; i++) { z: corners[i].z
987 < vertexes.length; i++) { });
988 < vertexes.length; i++) { });
989  
990 < vertexes.length; i++) { // Calculate 3D corners:
991 < vertexes.length; i++) { corners = perspective(corners, chart, false);
992  
993 < vertexes.length; i++) { // Get bounding box of 3D element:
994 < vertexes.length; i++) { each(corners, function(corner) {
995 < vertexes.length; i++) { bbox3d.minX = Math.min(bbox3d.minX, corner.x);
996 < vertexes.length; i++) { bbox3d.maxX = Math.max(bbox3d.maxX, corner.x);
997 < vertexes.length; i++) { bbox3d.minY = Math.min(bbox3d.minY, corner.y);
998 < vertexes.length; i++) { bbox3d.maxY = Math.max(bbox3d.maxY, corner.y);
999 < vertexes.length; i++) { });
1000  
1001 < vertexes.length; i++) { // Left edge:
1002 < vertexes.length; i++) { if (plotLeft > bbox3d.minX) {
1003 < vertexes.length; i++) { scale = Math.min(scale, 1 - Math.abs((plotLeft + originX) / (bbox3d.minX + originX)) % 1);
1004 < vertexes.length; i++) { }
1005  
1006 < vertexes.length; i++) { // Right edge:
1007 < vertexes.length; i++) { if (plotRight < bbox3d.maxX) {
1008 < vertexes.length; i++) {< bbox3d.maxX) { scale = Math.min(scale, (plotRight - originX) / (bbox3d.maxX - originX));
1009 < vertexes.length; i++) {< bbox3d.maxX) { }
1010  
1011 < vertexes.length; i++) {< bbox3d.maxX) { // Top edge:
1012 < vertexes.length; i++) {< bbox3d.maxX) { if (plotTop > bbox3d.minY) {
1013 < vertexes.length; i++) {< bbox3d.maxX) { if (bbox3d.minY < 0) {
1014 < vertexes.length; i++) {< bbox3d.maxX) { scale = Math.min(scale, (plotTop + originY) / (-bbox3d.minY + plotTop + originY));
1015 < vertexes.length; i++) {< bbox3d.maxX) { } else {
1016 < vertexes.length; i++) {< bbox3d.maxX) { scale = Math.min(scale, 1 - (plotTop + originY) / (bbox3d.minY + originY) % 1);
1017 < vertexes.length; i++) {< bbox3d.maxX) { }
1018 < vertexes.length; i++) {< bbox3d.maxX) { }
1019  
1020 < vertexes.length; i++) {< bbox3d.maxX) { // Bottom edge:
1021 < vertexes.length; i++) {< bbox3d.maxX) { if (plotBottom < bbox3d.maxY) {
1022 < vertexes.length; i++) {< bbox3d.maxX) { scale = Math.min(scale, Math.abs((plotBottom - originY) / (bbox3d.maxY - originY)));
1023 < vertexes.length; i++) {< bbox3d.maxX) { }
1024  
1025 < vertexes.length; i++) {< bbox3d.maxX) { return scale;
1026 < vertexes.length; i++) {< bbox3d.maxX) { }
1027  
1028  
1029  
1030 < vertexes.length; i++) {< bbox3d.maxX) { H.wrap(H.Chart.prototype, 'isInsidePlot', function(proceed) {
1031 < vertexes.length; i++) {< bbox3d.maxX) { return this.is3d() || proceed.apply(this, [].slice.call(arguments, 1));
1032 < vertexes.length; i++) {< bbox3d.maxX) { });
1033  
1034 < vertexes.length; i++) {< bbox3d.maxX) { var defaultOptions = H.getOptions();
1035 < vertexes.length; i++) {< bbox3d.maxX) { merge(true, defaultOptions, {
1036 < vertexes.length; i++) {< bbox3d.maxX) { chart: {
1037 < vertexes.length; i++) {< bbox3d.maxX) { options3d: {
1038 < vertexes.length; i++) {< bbox3d.maxX) { enabled: false,
1039 < vertexes.length; i++) {< bbox3d.maxX) { alpha: 0,
1040 < vertexes.length; i++) {< bbox3d.maxX) { beta: 0,
1041 < vertexes.length; i++) {< bbox3d.maxX) { depth: 100,
1042 < vertexes.length; i++) {< bbox3d.maxX) { fitToPlot: true,
1043 < vertexes.length; i++) {< bbox3d.maxX) { viewDistance: 25,
1044 < vertexes.length; i++) {< bbox3d.maxX) { frame: {
1045 < vertexes.length; i++) {< bbox3d.maxX) { bottom: {
1046 < vertexes.length; i++) {< bbox3d.maxX) { size: 1
1047 < vertexes.length; i++) {< bbox3d.maxX) { },
1048 < vertexes.length; i++) {< bbox3d.maxX) { side: {
1049 < vertexes.length; i++) {< bbox3d.maxX) { size: 1
1050 < vertexes.length; i++) {< bbox3d.maxX) { },
1051 < vertexes.length; i++) {< bbox3d.maxX) { back: {
1052 < vertexes.length; i++) {< bbox3d.maxX) { size: 1
1053 < vertexes.length; i++) {< bbox3d.maxX) { }
1054 < vertexes.length; i++) {< bbox3d.maxX) { }
1055 < vertexes.length; i++) {< bbox3d.maxX) { }
1056 < vertexes.length; i++) {< bbox3d.maxX) { }
1057 < vertexes.length; i++) {< bbox3d.maxX) { });
1058  
1059  
1060 < vertexes.length; i++) {< bbox3d.maxX) { /**
1061 < vertexes.length; i++) {< bbox3d.maxX) { * Override the getContainer by adding the required CSS classes for column
1062 < vertexes.length; i++) {< bbox3d.maxX) { * sides (#6018)
1063 < vertexes.length; i++) {< bbox3d.maxX) { */
1064 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Chart.prototype, 'getContainer', function(proceed) {
1065 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1066  
1067 < vertexes.length; i++) {< bbox3d.maxX) { this.renderer.definition({
1068 < vertexes.length; i++) {< bbox3d.maxX) { tagName: 'style',
1069 < vertexes.length; i++) {< bbox3d.maxX) { textContent: '.highcharts-3d-top{' +
1070 < vertexes.length; i++) {< bbox3d.maxX) { 'filter: url(#highcharts-brighter)' +
1071 < vertexes.length; i++) {< bbox3d.maxX) { '}\n' +
1072 < vertexes.length; i++) {< bbox3d.maxX) { '.highcharts-3d-side{' +
1073 < vertexes.length; i++) {< bbox3d.maxX) { 'filter: url(#highcharts-darker)' +
1074 < vertexes.length; i++) {< bbox3d.maxX) { '}\n'
1075 < vertexes.length; i++) {< bbox3d.maxX) { });
1076 < vertexes.length; i++) {< bbox3d.maxX) { });
1077  
1078  
1079 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Chart.prototype, 'setClassName', function(proceed) {
1080 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1081  
1082 < vertexes.length; i++) {< bbox3d.maxX) { if (this.is3d()) {
1083 < vertexes.length; i++) {< bbox3d.maxX) { this.container.className += ' highcharts-3d-chart';
1084 < vertexes.length; i++) {< bbox3d.maxX) { }
1085 < vertexes.length; i++) {< bbox3d.maxX) { });
1086  
1087 < vertexes.length; i++) {< bbox3d.maxX) { H.wrap(H.Chart.prototype, 'setChartSize', function(proceed) {
1088 < vertexes.length; i++) {< bbox3d.maxX) { var chart = this,
1089 < vertexes.length; i++) {< bbox3d.maxX) { options3d = chart.options.chart.options3d;
1090  
1091 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(chart, [].slice.call(arguments, 1));
1092  
1093 < vertexes.length; i++) {< bbox3d.maxX) { if (chart.is3d()) {
1094 < vertexes.length; i++) {< bbox3d.maxX) { var inverted = chart.inverted,
1095 < vertexes.length; i++) {< bbox3d.maxX) { clipBox = chart.clipBox,
1096 < vertexes.length; i++) {< bbox3d.maxX) { margin = chart.margin,
1097 < vertexes.length; i++) {< bbox3d.maxX) { x = inverted ? 'y' : 'x',
1098 < vertexes.length; i++) {< bbox3d.maxX) { y = inverted ? 'x' : 'y',
1099 < vertexes.length; i++) {< bbox3d.maxX) { w = inverted ? 'height' : 'width',
1100 < vertexes.length; i++) {< bbox3d.maxX) { h = inverted ? 'width' : 'height';
1101  
1102 < vertexes.length; i++) {< bbox3d.maxX) { clipBox[x] = -(margin[3] || 0);
1103 < vertexes.length; i++) {< bbox3d.maxX) { clipBox[y] = -(margin[0] || 0);
1104 < vertexes.length; i++) {< bbox3d.maxX) { clipBox[w] = chart.chartWidth + (margin[3] || 0) + (margin[1] || 0);
1105 < vertexes.length; i++) {< bbox3d.maxX) { clipBox[h] = chart.chartHeight + (margin[0] || 0) + (margin[2] || 0);
1106  
1107 < vertexes.length; i++) {< bbox3d.maxX) { // Set scale, used later in perspective method():
1108 < vertexes.length; i++) {< bbox3d.maxX) { chart.scale3d = 1; // @notice getScale uses perspective, so scale3d has to be reset.
1109 < vertexes.length; i++) {< bbox3d.maxX) { if (options3d.fitToPlot === true) {
1110 < vertexes.length; i++) {< bbox3d.maxX) { chart.scale3d = getScale(chart, options3d.depth);
1111 < vertexes.length; i++) {< bbox3d.maxX) { }
1112 < vertexes.length; i++) {< bbox3d.maxX) { }
1113 < vertexes.length; i++) {< bbox3d.maxX) { });
1114  
1115 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Chart.prototype, 'redraw', function(proceed) {
1116 < vertexes.length; i++) {< bbox3d.maxX) { if (this.is3d()) {
1117 < vertexes.length; i++) {< bbox3d.maxX) { // Set to force a redraw of all elements
1118 < vertexes.length; i++) {< bbox3d.maxX) { this.isDirtyBox = true;
1119 < vertexes.length; i++) {< bbox3d.maxX) { }
1120 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1121 < vertexes.length; i++) {< bbox3d.maxX) { });
1122  
1123 < vertexes.length; i++) {< bbox3d.maxX) { // Draw the series in the reverse order (#3803, #3917)
1124 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Chart.prototype, 'renderSeries', function(proceed) {
1125 < vertexes.length; i++) {< bbox3d.maxX) { var series,
1126 < vertexes.length; i++) {< bbox3d.maxX) { i = this.series.length;
1127  
1128 < vertexes.length; i++) {< bbox3d.maxX) { if (this.is3d()) {
1129 < vertexes.length; i++) {< bbox3d.maxX) { while (i--) {
1130 < vertexes.length; i++) {< bbox3d.maxX) { series = this.series[i];
1131 < vertexes.length; i++) {< bbox3d.maxX) { series.translate();
1132 < vertexes.length; i++) {< bbox3d.maxX) { series.render();
1133 < vertexes.length; i++) {< bbox3d.maxX) { }
1134 < vertexes.length; i++) {< bbox3d.maxX) { } else {
1135 < vertexes.length; i++) {< bbox3d.maxX) { proceed.call(this);
1136 < vertexes.length; i++) {< bbox3d.maxX) { }
1137 < vertexes.length; i++) {< bbox3d.maxX) { });
1138  
1139 < vertexes.length; i++) {< bbox3d.maxX) { Chart.prototype.retrieveStacks = function(stacking) {
1140 < vertexes.length; i++) {< bbox3d.maxX) { var series = this.series,
1141 < vertexes.length; i++) {< bbox3d.maxX) { stacks = {},
1142 < vertexes.length; i++) {< bbox3d.maxX) { stackNumber,
1143 < vertexes.length; i++) {< bbox3d.maxX) { i = 1;
1144  
1145 < vertexes.length; i++) {< bbox3d.maxX) { each(this.series, function(s) {
1146 < vertexes.length; i++) {< bbox3d.maxX) { stackNumber = pick(s.options.stack, (stacking ? 0 : series.length - 1 - s.index)); // #3841, #4532
1147 < vertexes.length; i++) {< bbox3d.maxX) { if (!stacks[stackNumber]) {
1148 < vertexes.length; i++) {< bbox3d.maxX) { stacks[stackNumber] = {
1149 < vertexes.length; i++) {< bbox3d.maxX) { series: [s],
1150 < vertexes.length; i++) {< bbox3d.maxX) { position: i
1151 < vertexes.length; i++) {< bbox3d.maxX) { };
1152 < vertexes.length; i++) {< bbox3d.maxX) { i++;
1153 < vertexes.length; i++) {< bbox3d.maxX) { } else {
1154 < vertexes.length; i++) {< bbox3d.maxX) { stacks[stackNumber].series.push(s);
1155 < vertexes.length; i++) {< bbox3d.maxX) { }
1156 < vertexes.length; i++) {< bbox3d.maxX) { });
1157  
1158 < vertexes.length; i++) {< bbox3d.maxX) { stacks.totalStacks = i + 1;
1159 < vertexes.length; i++) {< bbox3d.maxX) { return stacks;
1160 < vertexes.length; i++) {< bbox3d.maxX) { };
1161  
1162 < vertexes.length; i++) {< bbox3d.maxX) { }(Highcharts));
1163 < vertexes.length; i++) {< bbox3d.maxX) { (function(H) {
1164 < vertexes.length; i++) {< bbox3d.maxX) { /**
1165 < vertexes.length; i++) {< bbox3d.maxX) { * (c) 2010-2017 Torstein Honsi
1166 < vertexes.length; i++) {< bbox3d.maxX) { *
1167 < vertexes.length; i++) {< bbox3d.maxX) { * License: www.highcharts.com/license
1168 < vertexes.length; i++) {< bbox3d.maxX) { */
1169 < vertexes.length; i++) {< bbox3d.maxX) { var ZAxis,
1170  
1171 < vertexes.length; i++) {< bbox3d.maxX) { Axis = H.Axis,
1172 < vertexes.length; i++) {< bbox3d.maxX) { Chart = H.Chart,
1173 < vertexes.length; i++) {< bbox3d.maxX) { each = H.each,
1174 < vertexes.length; i++) {< bbox3d.maxX) { extend = H.extend,
1175 < vertexes.length; i++) {< bbox3d.maxX) { merge = H.merge,
1176 < vertexes.length; i++) {< bbox3d.maxX) { perspective = H.perspective,
1177 < vertexes.length; i++) {< bbox3d.maxX) { pick = H.pick,
1178 < vertexes.length; i++) {< bbox3d.maxX) { splat = H.splat,
1179 < vertexes.length; i++) {< bbox3d.maxX) { Tick = H.Tick,
1180 < vertexes.length; i++) {< bbox3d.maxX) { wrap = H.wrap;
1181 < vertexes.length; i++) {< bbox3d.maxX) { /***
1182 < vertexes.length; i++) {< bbox3d.maxX) { EXTENSION TO THE AXIS
1183 < vertexes.length; i++) {< bbox3d.maxX) { ***/
1184 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Axis.prototype, 'setOptions', function(proceed, userOptions) {
1185 < vertexes.length; i++) {< bbox3d.maxX) { var options;
1186 < vertexes.length; i++) {< bbox3d.maxX) { proceed.call(this, userOptions);
1187 < vertexes.length; i++) {< bbox3d.maxX) { if (this.chart.is3d() && this.coll !== 'colorAxis') {
1188 < vertexes.length; i++) {< bbox3d.maxX) { options = this.options;
1189 < vertexes.length; i++) {< bbox3d.maxX) { options.tickWidth = pick(options.tickWidth, 0);
1190 < vertexes.length; i++) {< bbox3d.maxX) { options.gridLineWidth = pick(options.gridLineWidth, 1);
1191 < vertexes.length; i++) {< bbox3d.maxX) { }
1192 < vertexes.length; i++) {< bbox3d.maxX) { });
1193  
1194 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Axis.prototype, 'render', function(proceed) {
1195 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1196  
1197 < vertexes.length; i++) {< bbox3d.maxX) { // Do not do this if the chart is not 3D
1198 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.chart.is3d() || this.coll === 'colorAxis') {
1199 < vertexes.length; i++) {< bbox3d.maxX) { return;
1200 < vertexes.length; i++) {< bbox3d.maxX) { }
1201  
1202 < vertexes.length; i++) {< bbox3d.maxX) { var chart = this.chart,
1203 < vertexes.length; i++) {< bbox3d.maxX) { renderer = chart.renderer,
1204 < vertexes.length; i++) {< bbox3d.maxX) { options3d = chart.options.chart.options3d,
1205 < vertexes.length; i++) {< bbox3d.maxX) { frame = options3d.frame,
1206 < vertexes.length; i++) {< bbox3d.maxX) { fbottom = frame.bottom,
1207 < vertexes.length; i++) {< bbox3d.maxX) { fback = frame.back,
1208 < vertexes.length; i++) {< bbox3d.maxX) { fside = frame.side,
1209 < vertexes.length; i++) {< bbox3d.maxX) { depth = options3d.depth,
1210 < vertexes.length; i++) {< bbox3d.maxX) { height = this.height,
1211 < vertexes.length; i++) {< bbox3d.maxX) { width = this.width,
1212 < vertexes.length; i++) {< bbox3d.maxX) { left = this.left,
1213 < vertexes.length; i++) {< bbox3d.maxX) { top = this.top;
1214  
1215 < vertexes.length; i++) {< bbox3d.maxX) { if (this.isZAxis) {
1216 < vertexes.length; i++) {< bbox3d.maxX) { return;
1217 < vertexes.length; i++) {< bbox3d.maxX) { }
1218 < vertexes.length; i++) {< bbox3d.maxX) { if (this.horiz) {
1219 < vertexes.length; i++) {< bbox3d.maxX) { var bottomShape = {
1220 < vertexes.length; i++) {< bbox3d.maxX) { x: left,
1221 < vertexes.length; i++) {< bbox3d.maxX) { y: top + (chart.xAxis[0].opposite ? -fbottom.size : height),
1222 < vertexes.length; i++) {< bbox3d.maxX) { z: 0,
1223 < vertexes.length; i++) {< bbox3d.maxX) { width: width,
1224 < vertexes.length; i++) {< bbox3d.maxX) { height: fbottom.size,
1225 < vertexes.length; i++) {< bbox3d.maxX) { depth: depth,
1226 < vertexes.length; i++) {< bbox3d.maxX) { insidePlotArea: false
1227 < vertexes.length; i++) {< bbox3d.maxX) { };
1228 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.bottomFrame) {
1229 < vertexes.length; i++) {< bbox3d.maxX) { this.bottomFrame = renderer.cuboid(bottomShape).attr({
1230 < vertexes.length; i++) {< bbox3d.maxX) { 'class': 'highcharts-3d-frame highcharts-3d-frame-bottom',
1231 < vertexes.length; i++) {< bbox3d.maxX) { 'zIndex': (chart.yAxis[0].reversed && options3d.alpha > 0 ? 4 : -1)
1232 < vertexes.length; i++) {< bbox3d.maxX) { }).add();
1233  
1234  
1235 < vertexes.length; i++) {< bbox3d.maxX) { } else {
1236 < vertexes.length; i++) {< bbox3d.maxX) { this.bottomFrame.animate(bottomShape);
1237 < vertexes.length; i++) {< bbox3d.maxX) { }
1238 < vertexes.length; i++) {< bbox3d.maxX) { } else {
1239 < vertexes.length; i++) {< bbox3d.maxX) { // BACK
1240 < vertexes.length; i++) {< bbox3d.maxX) { var backShape = {
1241 < vertexes.length; i++) {< bbox3d.maxX) { x: left + (chart.yAxis[0].opposite ? 0 : -fside.size),
1242 < vertexes.length; i++) {< bbox3d.maxX) { y: top + (chart.xAxis[0].opposite ? -fbottom.size : 0),
1243 < vertexes.length; i++) {< bbox3d.maxX) { z: depth,
1244 < vertexes.length; i++) {< bbox3d.maxX) { width: width + fside.size,
1245 < vertexes.length; i++) {< bbox3d.maxX) { height: height + fbottom.size,
1246 < vertexes.length; i++) {< bbox3d.maxX) { depth: fback.size,
1247 < vertexes.length; i++) {< bbox3d.maxX) { insidePlotArea: false
1248 < vertexes.length; i++) {< bbox3d.maxX) { };
1249 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.backFrame) {
1250 < vertexes.length; i++) {< bbox3d.maxX) { this.backFrame = renderer.cuboid(backShape).attr({
1251 < vertexes.length; i++) {< bbox3d.maxX) { 'class': 'highcharts-3d-frame highcharts-3d-frame-back',
1252 < vertexes.length; i++) {< bbox3d.maxX) { zIndex: -3
1253 < vertexes.length; i++) {< bbox3d.maxX) { }).add();
1254  
1255  
1256 < vertexes.length; i++) {< bbox3d.maxX) { } else {
1257 < vertexes.length; i++) {< bbox3d.maxX) { this.backFrame.animate(backShape);
1258 < vertexes.length; i++) {< bbox3d.maxX) { }
1259 < vertexes.length; i++) {< bbox3d.maxX) { var sideShape = {
1260 < vertexes.length; i++) {< bbox3d.maxX) { x: left + (chart.yAxis[0].opposite ? width : -fside.size),
1261 < vertexes.length; i++) {< bbox3d.maxX) { y: top + (chart.xAxis[0].opposite ? -fbottom.size : 0),
1262 < vertexes.length; i++) {< bbox3d.maxX) { z: 0,
1263 < vertexes.length; i++) {< bbox3d.maxX) { width: fside.size,
1264 < vertexes.length; i++) {< bbox3d.maxX) { height: height + fbottom.size,
1265 < vertexes.length; i++) {< bbox3d.maxX) { depth: depth,
1266 < vertexes.length; i++) {< bbox3d.maxX) { insidePlotArea: false
1267 < vertexes.length; i++) {< bbox3d.maxX) { };
1268 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.sideFrame) {
1269 < vertexes.length; i++) {< bbox3d.maxX) { this.sideFrame = renderer.cuboid(sideShape).attr({
1270 < vertexes.length; i++) {< bbox3d.maxX) { 'class': 'highcharts-3d-frame highcharts-3d-frame-side',
1271 < vertexes.length; i++) {< bbox3d.maxX) { zIndex: -2
1272 < vertexes.length; i++) {< bbox3d.maxX) { }).add();
1273  
1274  
1275  
1276 < vertexes.length; i++) {< bbox3d.maxX) { } else {
1277 < vertexes.length; i++) {< bbox3d.maxX) { this.sideFrame.animate(sideShape);
1278 < vertexes.length; i++) {< bbox3d.maxX) { }
1279 < vertexes.length; i++) {< bbox3d.maxX) { }
1280 < vertexes.length; i++) {< bbox3d.maxX) { });
1281  
1282 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Axis.prototype, 'getPlotLinePath', function(proceed) {
1283 < vertexes.length; i++) {< bbox3d.maxX) { var path = proceed.apply(this, [].slice.call(arguments, 1));
1284  
1285 < vertexes.length; i++) {< bbox3d.maxX) { // Do not do this if the chart is not 3D
1286 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.chart.is3d() || this.coll === 'colorAxis') {
1287 < vertexes.length; i++) {< bbox3d.maxX) { return path;
1288 < vertexes.length; i++) {< bbox3d.maxX) { }
1289  
1290 < vertexes.length; i++) {< bbox3d.maxX) { if (path === null) {
1291 < vertexes.length; i++) {< bbox3d.maxX) { return path;
1292 < vertexes.length; i++) {< bbox3d.maxX) { }
1293  
1294 < vertexes.length; i++) {< bbox3d.maxX) { var chart = this.chart,
1295 < vertexes.length; i++) {< bbox3d.maxX) { options3d = chart.options.chart.options3d,
1296 < vertexes.length; i++) {< bbox3d.maxX) { d = this.isZAxis ? chart.plotWidth : options3d.depth,
1297 < vertexes.length; i++) {< bbox3d.maxX) { opposite = this.opposite;
1298 < vertexes.length; i++) {< bbox3d.maxX) { if (this.horiz) {
1299 < vertexes.length; i++) {< bbox3d.maxX) { opposite = !opposite;
1300 < vertexes.length; i++) {< bbox3d.maxX) { }
1301 < vertexes.length; i++) {< bbox3d.maxX) { var pArr = [
1302 < vertexes.length; i++) {< bbox3d.maxX) { this.swapZ({
1303 < vertexes.length; i++) {< bbox3d.maxX) { x: path[1],
1304 < vertexes.length; i++) {< bbox3d.maxX) { y: path[2],
1305 < vertexes.length; i++) {< bbox3d.maxX) { z: (opposite ? d : 0)
1306 < vertexes.length; i++) {< bbox3d.maxX) { }),
1307 < vertexes.length; i++) {< bbox3d.maxX) { this.swapZ({
1308 < vertexes.length; i++) {< bbox3d.maxX) { x: path[1],
1309 < vertexes.length; i++) {< bbox3d.maxX) { y: path[2],
1310 < vertexes.length; i++) {< bbox3d.maxX) { z: d
1311 < vertexes.length; i++) {< bbox3d.maxX) { }),
1312 < vertexes.length; i++) {< bbox3d.maxX) { this.swapZ({
1313 < vertexes.length; i++) {< bbox3d.maxX) { x: path[4],
1314 < vertexes.length; i++) {< bbox3d.maxX) { y: path[5],
1315 < vertexes.length; i++) {< bbox3d.maxX) { z: d
1316 < vertexes.length; i++) {< bbox3d.maxX) { }),
1317 < vertexes.length; i++) {< bbox3d.maxX) { this.swapZ({
1318 < vertexes.length; i++) {< bbox3d.maxX) { x: path[4],
1319 < vertexes.length; i++) {< bbox3d.maxX) { y: path[5],
1320 < vertexes.length; i++) {< bbox3d.maxX) { z: (opposite ? 0 : d)
1321 < vertexes.length; i++) {< bbox3d.maxX) { })
1322 < vertexes.length; i++) {< bbox3d.maxX) { ];
1323  
1324 < vertexes.length; i++) {< bbox3d.maxX) { pArr = perspective(pArr, this.chart, false);
1325 < vertexes.length; i++) {< bbox3d.maxX) { path = this.chart.renderer.toLinePath(pArr, false);
1326  
1327 < vertexes.length; i++) {< bbox3d.maxX) { return path;
1328 < vertexes.length; i++) {< bbox3d.maxX) { });
1329  
1330 < vertexes.length; i++) {< bbox3d.maxX) { // Do not draw axislines in 3D
1331 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Axis.prototype, 'getLinePath', function(proceed) {
1332 < vertexes.length; i++) {< bbox3d.maxX) { return this.chart.is3d() ? [] : proceed.apply(this, [].slice.call(arguments, 1));
1333 < vertexes.length; i++) {< bbox3d.maxX) { });
1334  
1335 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Axis.prototype, 'getPlotBandPath', function(proceed) {
1336 < vertexes.length; i++) {< bbox3d.maxX) { // Do not do this if the chart is not 3D
1337 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.chart.is3d() || this.coll === 'colorAxis') {
1338 < vertexes.length; i++) {< bbox3d.maxX) { return proceed.apply(this, [].slice.call(arguments, 1));
1339 < vertexes.length; i++) {< bbox3d.maxX) { }
1340  
1341 < vertexes.length; i++) {< bbox3d.maxX) { var args = arguments,
1342 < vertexes.length; i++) {< bbox3d.maxX) { from = args[1],
1343 < vertexes.length; i++) {< bbox3d.maxX) { to = args[2],
1344 < vertexes.length; i++) {< bbox3d.maxX) { toPath = this.getPlotLinePath(to),
1345 < vertexes.length; i++) {< bbox3d.maxX) { path = this.getPlotLinePath(from);
1346  
1347 < vertexes.length; i++) {< bbox3d.maxX) { if (path && toPath) {
1348 < vertexes.length; i++) {< bbox3d.maxX) { path.push(
1349 < vertexes.length; i++) {< bbox3d.maxX) { 'L',
1350 < vertexes.length; i++) {< bbox3d.maxX) { toPath[10], // These two do not exist in the regular getPlotLine
1351 < vertexes.length; i++) {< bbox3d.maxX) { toPath[11], // ---- # 3005
1352 < vertexes.length; i++) {< bbox3d.maxX) { 'L',
1353 < vertexes.length; i++) {< bbox3d.maxX) { toPath[7],
1354 < vertexes.length; i++) {< bbox3d.maxX) { toPath[8],
1355 < vertexes.length; i++) {< bbox3d.maxX) { 'L',
1356 < vertexes.length; i++) {< bbox3d.maxX) { toPath[4],
1357 < vertexes.length; i++) {< bbox3d.maxX) { toPath[5],
1358 < vertexes.length; i++) {< bbox3d.maxX) { 'L',
1359 < vertexes.length; i++) {< bbox3d.maxX) { toPath[1],
1360 < vertexes.length; i++) {< bbox3d.maxX) { toPath[2]
1361 < vertexes.length; i++) {< bbox3d.maxX) { );
1362 < vertexes.length; i++) {< bbox3d.maxX) { } else { // outside the axis area
1363 < vertexes.length; i++) {< bbox3d.maxX) { path = null;
1364 < vertexes.length; i++) {< bbox3d.maxX) { }
1365  
1366 < vertexes.length; i++) {< bbox3d.maxX) { return path;
1367 < vertexes.length; i++) {< bbox3d.maxX) { });
1368  
1369 < vertexes.length; i++) {< bbox3d.maxX) { /***
1370 < vertexes.length; i++) {< bbox3d.maxX) { EXTENSION TO THE TICKS
1371 < vertexes.length; i++) {< bbox3d.maxX) { ***/
1372  
1373 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Tick.prototype, 'getMarkPath', function(proceed) {
1374 < vertexes.length; i++) {< bbox3d.maxX) { var path = proceed.apply(this, [].slice.call(arguments, 1));
1375  
1376 < vertexes.length; i++) {< bbox3d.maxX) { // Do not do this if the chart is not 3D
1377 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.axis.chart.is3d() || this.coll === 'colorAxis') {
1378 < vertexes.length; i++) {< bbox3d.maxX) { return path;
1379 < vertexes.length; i++) {< bbox3d.maxX) { }
1380  
1381 < vertexes.length; i++) {< bbox3d.maxX) { var pArr = [
1382 < vertexes.length; i++) {< bbox3d.maxX) { this.axis.swapZ({
1383 < vertexes.length; i++) {< bbox3d.maxX) { x: path[1],
1384 < vertexes.length; i++) {< bbox3d.maxX) { y: path[2],
1385 < vertexes.length; i++) {< bbox3d.maxX) { z: 0
1386 < vertexes.length; i++) {< bbox3d.maxX) { }),
1387 < vertexes.length; i++) {< bbox3d.maxX) { this.axis.swapZ({
1388 < vertexes.length; i++) {< bbox3d.maxX) { x: path[4],
1389 < vertexes.length; i++) {< bbox3d.maxX) { y: path[5],
1390 < vertexes.length; i++) {< bbox3d.maxX) { z: 0
1391 < vertexes.length; i++) {< bbox3d.maxX) { })
1392 < vertexes.length; i++) {< bbox3d.maxX) { ];
1393  
1394 < vertexes.length; i++) {< bbox3d.maxX) { pArr = perspective(pArr, this.axis.chart, false);
1395 < vertexes.length; i++) {< bbox3d.maxX) { path = [
1396 < vertexes.length; i++) {< bbox3d.maxX) { 'M', pArr[0].x, pArr[0].y,
1397 < vertexes.length; i++) {< bbox3d.maxX) { 'L', pArr[1].x, pArr[1].y
1398 < vertexes.length; i++) {< bbox3d.maxX) { ];
1399 < vertexes.length; i++) {< bbox3d.maxX) { return path;
1400 < vertexes.length; i++) {< bbox3d.maxX) { });
1401  
1402 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Tick.prototype, 'getLabelPosition', function(proceed) {
1403 < vertexes.length; i++) {< bbox3d.maxX) { var pos = proceed.apply(this, [].slice.call(arguments, 1));
1404  
1405 < vertexes.length; i++) {< bbox3d.maxX) { // Do not do this if the chart is not 3D
1406 < vertexes.length; i++) {< bbox3d.maxX) { if (this.axis.chart.is3d() && this.coll !== 'colorAxis') {
1407 < vertexes.length; i++) {< bbox3d.maxX) { pos = perspective([this.axis.swapZ({
1408 < vertexes.length; i++) {< bbox3d.maxX) { x: pos.x,
1409 < vertexes.length; i++) {< bbox3d.maxX) { y: pos.y,
1410 < vertexes.length; i++) {< bbox3d.maxX) { z: 0
1411 < vertexes.length; i++) {< bbox3d.maxX) { })], this.axis.chart, false)[0];
1412 < vertexes.length; i++) {< bbox3d.maxX) { }
1413 < vertexes.length; i++) {< bbox3d.maxX) { return pos;
1414 < vertexes.length; i++) {< bbox3d.maxX) { });
1415  
1416 < vertexes.length; i++) {< bbox3d.maxX) { H.wrap(Axis.prototype, 'getTitlePosition', function(proceed) {
1417 < vertexes.length; i++) {< bbox3d.maxX) { var is3d = this.chart.is3d() && this.coll !== 'colorAxis',
1418 < vertexes.length; i++) {< bbox3d.maxX) { pos,
1419 < vertexes.length; i++) {< bbox3d.maxX) { axisTitleMargin;
1420  
1421 < vertexes.length; i++) {< bbox3d.maxX) { // Pull out the axis title margin, that is not subject to the perspective
1422 < vertexes.length; i++) {< bbox3d.maxX) { if (is3d) {
1423 < vertexes.length; i++) {< bbox3d.maxX) { axisTitleMargin = this.axisTitleMargin;
1424 < vertexes.length; i++) {< bbox3d.maxX) { this.axisTitleMargin = 0;
1425 < vertexes.length; i++) {< bbox3d.maxX) { }
1426  
1427 < vertexes.length; i++) {< bbox3d.maxX) { pos = proceed.apply(this, [].slice.call(arguments, 1));
1428  
1429 < vertexes.length; i++) {< bbox3d.maxX) { if (is3d) {
1430 < vertexes.length; i++) {< bbox3d.maxX) { pos = perspective([this.swapZ({
1431 < vertexes.length; i++) {< bbox3d.maxX) { x: pos.x,
1432 < vertexes.length; i++) {< bbox3d.maxX) { y: pos.y,
1433 < vertexes.length; i++) {< bbox3d.maxX) { z: 0
1434 < vertexes.length; i++) {< bbox3d.maxX) { })], this.chart, false)[0];
1435  
1436 < vertexes.length; i++) {< bbox3d.maxX) { // Re-apply the axis title margin outside the perspective
1437 < vertexes.length; i++) {< bbox3d.maxX) { pos[this.horiz ? 'y' : 'x'] += (this.horiz ? 1 : -1) * // horizontal axis reverses the margin ...
1438 < vertexes.length; i++) {< bbox3d.maxX) { (this.opposite ? -1 : 1) * // ... so does opposite axes
1439 < vertexes.length; i++) {< bbox3d.maxX) { axisTitleMargin;
1440 < vertexes.length; i++) {< bbox3d.maxX) { this.axisTitleMargin = axisTitleMargin;
1441 < vertexes.length; i++) {< bbox3d.maxX) { }
1442 < vertexes.length; i++) {< bbox3d.maxX) { return pos;
1443 < vertexes.length; i++) {< bbox3d.maxX) { });
1444  
1445 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Axis.prototype, 'drawCrosshair', function(proceed) {
1446 < vertexes.length; i++) {< bbox3d.maxX) { var args = arguments;
1447 < vertexes.length; i++) {< bbox3d.maxX) { if (this.chart.is3d()) {
1448 < vertexes.length; i++) {< bbox3d.maxX) { if (args[2]) {
1449 < vertexes.length; i++) {< bbox3d.maxX) { args[2] = {
1450 < vertexes.length; i++) {< bbox3d.maxX) { plotX: args[2].plotXold || args[2].plotX,
1451 < vertexes.length; i++) {< bbox3d.maxX) { plotY: args[2].plotYold || args[2].plotY
1452 < vertexes.length; i++) {< bbox3d.maxX) { };
1453 < vertexes.length; i++) {< bbox3d.maxX) { }
1454 < vertexes.length; i++) {< bbox3d.maxX) { }
1455 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(args, 1));
1456 < vertexes.length; i++) {< bbox3d.maxX) { });
1457  
1458 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Axis.prototype, 'destroy', function(proceed) {
1459 < vertexes.length; i++) {< bbox3d.maxX) { each(['backFrame', 'bottomFrame', 'sideFrame'], function(prop) {
1460 < vertexes.length; i++) {< bbox3d.maxX) { if (this[prop]) {
1461 < vertexes.length; i++) {< bbox3d.maxX) { this[prop] = this[prop].destroy();
1462 < vertexes.length; i++) {< bbox3d.maxX) { }
1463 < vertexes.length; i++) {< bbox3d.maxX) { }, this);
1464 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1465 < vertexes.length; i++) {< bbox3d.maxX) { });
1466  
1467 < vertexes.length; i++) {< bbox3d.maxX) { /***
1468 < vertexes.length; i++) {< bbox3d.maxX) { Z-AXIS
1469 < vertexes.length; i++) {< bbox3d.maxX) { ***/
1470  
1471 < vertexes.length; i++) {< bbox3d.maxX) { Axis.prototype.swapZ = function(p, insidePlotArea) {
1472 < vertexes.length; i++) {< bbox3d.maxX) { if (this.isZAxis) {
1473 < vertexes.length; i++) {< bbox3d.maxX) { var plotLeft = insidePlotArea ? 0 : this.chart.plotLeft;
1474 < vertexes.length; i++) {< bbox3d.maxX) { var chart = this.chart;
1475 < vertexes.length; i++) {< bbox3d.maxX) { return {
1476 < vertexes.length; i++) {< bbox3d.maxX) { x: plotLeft + (chart.yAxis[0].opposite ? p.z : chart.xAxis[0].width - p.z),
1477 < vertexes.length; i++) {< bbox3d.maxX) { y: p.y,
1478 < vertexes.length; i++) {< bbox3d.maxX) { z: p.x - plotLeft
1479 < vertexes.length; i++) {< bbox3d.maxX) { };
1480 < vertexes.length; i++) {< bbox3d.maxX) { }
1481 < vertexes.length; i++) {< bbox3d.maxX) { return p;
1482 < vertexes.length; i++) {< bbox3d.maxX) { };
1483  
1484 < vertexes.length; i++) {< bbox3d.maxX) { ZAxis = H.ZAxis = function() {
1485 < vertexes.length; i++) {< bbox3d.maxX) { this.init.apply(this, arguments);
1486 < vertexes.length; i++) {< bbox3d.maxX) { };
1487 < vertexes.length; i++) {< bbox3d.maxX) { extend(ZAxis.prototype, Axis.prototype);
1488 < vertexes.length; i++) {< bbox3d.maxX) { extend(ZAxis.prototype, {
1489 < vertexes.length; i++) {< bbox3d.maxX) { isZAxis: true,
1490 < vertexes.length; i++) {< bbox3d.maxX) { setOptions: function(userOptions) {
1491 < vertexes.length; i++) {< bbox3d.maxX) { userOptions = merge({
1492 < vertexes.length; i++) {< bbox3d.maxX) { offset: 0,
1493 < vertexes.length; i++) {< bbox3d.maxX) { lineWidth: 0
1494 < vertexes.length; i++) {< bbox3d.maxX) { }, userOptions);
1495 < vertexes.length; i++) {< bbox3d.maxX) { Axis.prototype.setOptions.call(this, userOptions);
1496 < vertexes.length; i++) {< bbox3d.maxX) { this.coll = 'zAxis';
1497 < vertexes.length; i++) {< bbox3d.maxX) { },
1498 < vertexes.length; i++) {< bbox3d.maxX) { setAxisSize: function() {
1499 < vertexes.length; i++) {< bbox3d.maxX) { Axis.prototype.setAxisSize.call(this);
1500 < vertexes.length; i++) {< bbox3d.maxX) { this.width = this.len = this.chart.options.chart.options3d.depth;
1501 < vertexes.length; i++) {< bbox3d.maxX) { this.right = this.chart.chartWidth - this.width - this.left;
1502 < vertexes.length; i++) {< bbox3d.maxX) { },
1503 < vertexes.length; i++) {< bbox3d.maxX) { getSeriesExtremes: function() {
1504 < vertexes.length; i++) {< bbox3d.maxX) { var axis = this,
1505 < vertexes.length; i++) {< bbox3d.maxX) { chart = axis.chart;
1506  
1507 < vertexes.length; i++) {< bbox3d.maxX) { axis.hasVisibleSeries = false;
1508  
1509 < vertexes.length; i++) {< bbox3d.maxX) { // Reset properties in case we're redrawing (#3353)
1510 < vertexes.length; i++) {< bbox3d.maxX) { axis.dataMin = axis.dataMax = axis.ignoreMinPadding = axis.ignoreMaxPadding = null;
1511  
1512 < vertexes.length; i++) {< bbox3d.maxX) { if (axis.buildStacks) {
1513 < vertexes.length; i++) {< bbox3d.maxX) { axis.buildStacks();
1514 < vertexes.length; i++) {< bbox3d.maxX) { }
1515  
1516 < vertexes.length; i++) {< bbox3d.maxX) { // loop through this axis' series
1517 < vertexes.length; i++) {< bbox3d.maxX) { each(axis.series, function(series) {
1518  
1519 < vertexes.length; i++) {< bbox3d.maxX) { if (series.visible || !chart.options.chart.ignoreHiddenSeries) {
1520  
1521 < vertexes.length; i++) {< bbox3d.maxX) { var seriesOptions = series.options,
1522 < vertexes.length; i++) {< bbox3d.maxX) { zData,
1523 < vertexes.length; i++) {< bbox3d.maxX) { threshold = seriesOptions.threshold;
1524  
1525 < vertexes.length; i++) {< bbox3d.maxX) { axis.hasVisibleSeries = true;
1526  
1527 < vertexes.length; i++) {< bbox3d.maxX) { // Validate threshold in logarithmic axes
1528 < vertexes.length; i++) {< bbox3d.maxX) { if (axis.positiveValuesOnly && threshold <= 0) {
1529 < vertexes.length; i++) {< bbox3d.maxX) { threshold = null;
1530 < vertexes.length; i++) {< bbox3d.maxX) { }
1531  
1532 < vertexes.length; i++) {< bbox3d.maxX) { zData = series.zData;
1533 < vertexes.length; i++) {< bbox3d.maxX) { if (zData.length) {
1534 < vertexes.length; i++) {< bbox3d.maxX) { axis.dataMin = Math.min(pick(axis.dataMin, zData[0]), Math.min.apply(null, zData));
1535 < vertexes.length; i++) {< bbox3d.maxX) { axis.dataMax = Math.max(pick(axis.dataMax, zData[0]), Math.max.apply(null, zData));
1536 < vertexes.length; i++) {< bbox3d.maxX) { }
1537 < vertexes.length; i++) {< bbox3d.maxX) { }
1538 < vertexes.length; i++) {< bbox3d.maxX) { });
1539 < vertexes.length; i++) {< bbox3d.maxX) { }
1540 < vertexes.length; i++) {< bbox3d.maxX) { });
1541  
1542  
1543 < vertexes.length; i++) {< bbox3d.maxX) { /**
1544 < vertexes.length; i++) {< bbox3d.maxX) { * Extend the chart getAxes method to also get the color axis
1545 < vertexes.length; i++) {< bbox3d.maxX) { */
1546 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Chart.prototype, 'getAxes', function(proceed) {
1547 < vertexes.length; i++) {< bbox3d.maxX) { var chart = this,
1548 < vertexes.length; i++) {< bbox3d.maxX) { options = this.options,
1549 < vertexes.length; i++) {< bbox3d.maxX) { zAxisOptions = options.zAxis = splat(options.zAxis || {});
1550  
1551 < vertexes.length; i++) {< bbox3d.maxX) { proceed.call(this);
1552  
1553 < vertexes.length; i++) {< bbox3d.maxX) { if (!chart.is3d()) {
1554 < vertexes.length; i++) {< bbox3d.maxX) { return;
1555 < vertexes.length; i++) {< bbox3d.maxX) { }
1556 < vertexes.length; i++) {< bbox3d.maxX) { this.zAxis = [];
1557 < vertexes.length; i++) {< bbox3d.maxX) { each(zAxisOptions, function(axisOptions, i) {
1558 < vertexes.length; i++) {< bbox3d.maxX) { axisOptions.index = i;
1559 < vertexes.length; i++) {< bbox3d.maxX) { axisOptions.isX = true; //Z-Axis is shown horizontally, so it's kind of a X-Axis
1560 < vertexes.length; i++) {< bbox3d.maxX) { var zAxis = new ZAxis(chart, axisOptions);
1561 < vertexes.length; i++) {< bbox3d.maxX) { zAxis.setScale();
1562 < vertexes.length; i++) {< bbox3d.maxX) { });
1563 < vertexes.length; i++) {< bbox3d.maxX) { });
1564  
1565 < vertexes.length; i++) {< bbox3d.maxX) { }(Highcharts));
1566 < vertexes.length; i++) {< bbox3d.maxX) { (function(H) {
1567 < vertexes.length; i++) {< bbox3d.maxX) { /**
1568 < vertexes.length; i++) {< bbox3d.maxX) { * (c) 2010-2017 Torstein Honsi
1569 < vertexes.length; i++) {< bbox3d.maxX) { *
1570 < vertexes.length; i++) {< bbox3d.maxX) { * License: www.highcharts.com/license
1571 < vertexes.length; i++) {< bbox3d.maxX) { */
1572 < vertexes.length; i++) {< bbox3d.maxX) { var each = H.each,
1573 < vertexes.length; i++) {< bbox3d.maxX) { perspective = H.perspective,
1574 < vertexes.length; i++) {< bbox3d.maxX) { pick = H.pick,
1575 < vertexes.length; i++) {< bbox3d.maxX) { Series = H.Series,
1576 < vertexes.length; i++) {< bbox3d.maxX) { seriesTypes = H.seriesTypes,
1577 < vertexes.length; i++) {< bbox3d.maxX) { svg = H.svg,
1578 < vertexes.length; i++) {< bbox3d.maxX) { wrap = H.wrap;
1579 < vertexes.length; i++) {< bbox3d.maxX) { /***
1580 < vertexes.length; i++) {< bbox3d.maxX) { EXTENSION FOR 3D COLUMNS
1581 < vertexes.length; i++) {< bbox3d.maxX) { ***/
1582 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.column.prototype, 'translate', function(proceed) {
1583 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1584  
1585 < vertexes.length; i++) {< bbox3d.maxX) { // Do not do this if the chart is not 3D
1586 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.chart.is3d()) {
1587 < vertexes.length; i++) {< bbox3d.maxX) { return;
1588 < vertexes.length; i++) {< bbox3d.maxX) { }
1589  
1590 < vertexes.length; i++) {< bbox3d.maxX) { var series = this,
1591 < vertexes.length; i++) {< bbox3d.maxX) { chart = series.chart,
1592 < vertexes.length; i++) {< bbox3d.maxX) { seriesOptions = series.options,
1593 < vertexes.length; i++) {< bbox3d.maxX) { depth = seriesOptions.depth || 25;
1594  
1595 < vertexes.length; i++) {< bbox3d.maxX) { var stack = seriesOptions.stacking ? (seriesOptions.stack || 0) : series._i;
1596 < vertexes.length; i++) {< bbox3d.maxX) { var z = stack * (depth + (seriesOptions.groupZPadding || 1));
1597  
1598 < vertexes.length; i++) {< bbox3d.maxX) { if (seriesOptions.grouping !== false) {
1599 < vertexes.length; i++) {< bbox3d.maxX) { z = 0;
1600 < vertexes.length; i++) {< bbox3d.maxX) { }
1601  
1602 < vertexes.length; i++) {< bbox3d.maxX) { z += (seriesOptions.groupZPadding || 1);
1603  
1604 < vertexes.length; i++) {< bbox3d.maxX) { each(series.data, function(point) {
1605 < vertexes.length; i++) {< bbox3d.maxX) { if (point.y !== null) {
1606 < vertexes.length; i++) {< bbox3d.maxX) { var shapeArgs = point.shapeArgs,
1607 < vertexes.length; i++) {< bbox3d.maxX) { tooltipPos = point.tooltipPos;
1608  
1609 < vertexes.length; i++) {< bbox3d.maxX) { point.shapeType = 'cuboid';
1610 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.z = z;
1611 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.depth = depth;
1612 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.insidePlotArea = true;
1613  
1614 < vertexes.length; i++) {< bbox3d.maxX) { // Translate the tooltip position in 3d space
1615 < vertexes.length; i++) {< bbox3d.maxX) { tooltipPos = perspective([{
1616 < vertexes.length; i++) {< bbox3d.maxX) { x: tooltipPos[0],
1617 < vertexes.length; i++) {< bbox3d.maxX) { y: tooltipPos[1],
1618 < vertexes.length; i++) {< bbox3d.maxX) { z: z
1619 < vertexes.length; i++) {< bbox3d.maxX) { }], chart, true)[0];
1620 < vertexes.length; i++) {< bbox3d.maxX) { point.tooltipPos = [tooltipPos.x, tooltipPos.y];
1621 < vertexes.length; i++) {< bbox3d.maxX) { }
1622 < vertexes.length; i++) {< bbox3d.maxX) { });
1623 < vertexes.length; i++) {< bbox3d.maxX) { // store for later use #4067
1624 < vertexes.length; i++) {< bbox3d.maxX) { series.z = z;
1625 < vertexes.length; i++) {< bbox3d.maxX) { });
1626  
1627 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.column.prototype, 'animate', function(proceed) {
1628 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.chart.is3d()) {
1629 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1630 < vertexes.length; i++) {< bbox3d.maxX) { } else {
1631 < vertexes.length; i++) {< bbox3d.maxX) { var args = arguments,
1632 < vertexes.length; i++) {< bbox3d.maxX) { init = args[1],
1633 < vertexes.length; i++) {< bbox3d.maxX) { yAxis = this.yAxis,
1634 < vertexes.length; i++) {< bbox3d.maxX) { series = this,
1635 < vertexes.length; i++) {< bbox3d.maxX) { reversed = this.yAxis.reversed;
1636  
1637 < vertexes.length; i++) {< bbox3d.maxX) { if (svg) { // VML is too slow anyway
1638 < vertexes.length; i++) {< bbox3d.maxX) { if (init) {
1639 < vertexes.length; i++) {< bbox3d.maxX) { each(series.data, function(point) {
1640 < vertexes.length; i++) {< bbox3d.maxX) { if (point.y !== null) {
1641 < vertexes.length; i++) {< bbox3d.maxX) { point.height = point.shapeArgs.height;
1642 < vertexes.length; i++) {< bbox3d.maxX) { point.shapey = point.shapeArgs.y; //#2968
1643 < vertexes.length; i++) {< bbox3d.maxX) { point.shapeArgs.height = 1;
1644 < vertexes.length; i++) {< bbox3d.maxX) { if (!reversed) {
1645 < vertexes.length; i++) {< bbox3d.maxX) { if (point.stackY) {
1646 < vertexes.length; i++) {< bbox3d.maxX) { point.shapeArgs.y = point.plotY + yAxis.translate(point.stackY);
1647 < vertexes.length; i++) {< bbox3d.maxX) { } else {
1648 < vertexes.length; i++) {< bbox3d.maxX) { point.shapeArgs.y = point.plotY + (point.negative ? -point.height : point.height);
1649 < vertexes.length; i++) {< bbox3d.maxX) { }
1650 < vertexes.length; i++) {< bbox3d.maxX) { }
1651 < vertexes.length; i++) {< bbox3d.maxX) { }
1652 < vertexes.length; i++) {< bbox3d.maxX) { });
1653  
1654 < vertexes.length; i++) {< bbox3d.maxX) { } else { // run the animation
1655 < vertexes.length; i++) {< bbox3d.maxX) { each(series.data, function(point) {
1656 < vertexes.length; i++) {< bbox3d.maxX) { if (point.y !== null) {
1657 < vertexes.length; i++) {< bbox3d.maxX) { point.shapeArgs.height = point.height;
1658 < vertexes.length; i++) {< bbox3d.maxX) { point.shapeArgs.y = point.shapey; //#2968
1659 < vertexes.length; i++) {< bbox3d.maxX) { // null value do not have a graphic
1660 < vertexes.length; i++) {< bbox3d.maxX) { if (point.graphic) {
1661 < vertexes.length; i++) {< bbox3d.maxX) { point.graphic.animate(point.shapeArgs, series.options.animation);
1662 < vertexes.length; i++) {< bbox3d.maxX) { }
1663 < vertexes.length; i++) {< bbox3d.maxX) { }
1664 < vertexes.length; i++) {< bbox3d.maxX) { });
1665  
1666 < vertexes.length; i++) {< bbox3d.maxX) { // redraw datalabels to the correct position
1667 < vertexes.length; i++) {< bbox3d.maxX) { this.drawDataLabels();
1668  
1669 < vertexes.length; i++) {< bbox3d.maxX) { // delete this function to allow it only once
1670 < vertexes.length; i++) {< bbox3d.maxX) { series.animate = null;
1671 < vertexes.length; i++) {< bbox3d.maxX) { }
1672 < vertexes.length; i++) {< bbox3d.maxX) { }
1673 < vertexes.length; i++) {< bbox3d.maxX) { }
1674 < vertexes.length; i++) {< bbox3d.maxX) { });
1675  
1676 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.column.prototype, 'init', function(proceed) {
1677 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1678  
1679 < vertexes.length; i++) {< bbox3d.maxX) { if (this.chart.is3d()) {
1680 < vertexes.length; i++) {< bbox3d.maxX) { var seriesOptions = this.options,
1681 < vertexes.length; i++) {< bbox3d.maxX) { grouping = seriesOptions.grouping,
1682 < vertexes.length; i++) {< bbox3d.maxX) { stacking = seriesOptions.stacking,
1683 < vertexes.length; i++) {< bbox3d.maxX) { reversedStacks = pick(this.yAxis.options.reversedStacks, true),
1684 < vertexes.length; i++) {< bbox3d.maxX) { z = 0;
1685  
1686 < vertexes.length; i++) {< bbox3d.maxX) { if (!(grouping !== undefined && !grouping)) {
1687 < vertexes.length; i++) {< bbox3d.maxX) { var stacks = this.chart.retrieveStacks(stacking),
1688 < vertexes.length; i++) {< bbox3d.maxX) { stack = seriesOptions.stack || 0,
1689 < vertexes.length; i++) {< bbox3d.maxX) { i; // position within the stack
1690 < vertexes.length; i++) {< bbox3d.maxX) { for (i = 0; i < stacks[stack].series.length; i++) {
1691 < vertexes.length; i++) {< bbox3d.maxX) { if (stacks[stack].series[i] === this) {
1692 < vertexes.length; i++) {< bbox3d.maxX) { break;
1693 < vertexes.length; i++) {< bbox3d.maxX) { }
1694 < vertexes.length; i++) {< bbox3d.maxX) { }
1695 < vertexes.length; i++) {< bbox3d.maxX) { z = (10 * (stacks.totalStacks - stacks[stack].position)) + (reversedStacks ? i : -i); // #4369
1696  
1697 < vertexes.length; i++) {< bbox3d.maxX) { // In case when axis is reversed, columns are also reversed inside the group (#3737)
1698 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.xAxis.reversed) {
1699 < vertexes.length; i++) {< bbox3d.maxX) { z = (stacks.totalStacks * 10) - z;
1700 < vertexes.length; i++) {< bbox3d.maxX) { }
1701 < vertexes.length; i++) {< bbox3d.maxX) { }
1702  
1703 < vertexes.length; i++) {< bbox3d.maxX) { seriesOptions.zIndex = z;
1704 < vertexes.length; i++) {< bbox3d.maxX) { }
1705 < vertexes.length; i++) {< bbox3d.maxX) { });
1706  
1707  
1708  
1709 < vertexes.length; i++) {< bbox3d.maxX) { function draw3DPoints(proceed) {
1710 < vertexes.length; i++) {< bbox3d.maxX) { // Do not do this if the chart is not 3D
1711 < vertexes.length; i++) {< bbox3d.maxX) { if (this.chart.is3d()) {
1712 < vertexes.length; i++) {< bbox3d.maxX) { var grouping = this.chart.options.plotOptions.column.grouping;
1713 < vertexes.length; i++) {< bbox3d.maxX) { if (grouping !== undefined && !grouping && this.group.zIndex !== undefined && !this.zIndexSet) {
1714 < vertexes.length; i++) {< bbox3d.maxX) { this.group.attr({
1715 < vertexes.length; i++) {< bbox3d.maxX) { zIndex: this.group.zIndex * 10
1716 < vertexes.length; i++) {< bbox3d.maxX) { });
1717 < vertexes.length; i++) {< bbox3d.maxX) { this.zIndexSet = true; // #4062 set zindex only once
1718 < vertexes.length; i++) {< bbox3d.maxX) { }
1719 < vertexes.length; i++) {< bbox3d.maxX) { }
1720  
1721 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1722 < vertexes.length; i++) {< bbox3d.maxX) { }
1723  
1724 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Series.prototype, 'alignDataLabel', function(proceed) {
1725  
1726 < vertexes.length; i++) {< bbox3d.maxX) { // Only do this for 3D columns and columnranges
1727 < vertexes.length; i++) {< bbox3d.maxX) { if (this.chart.is3d() && (this.type === 'column' || this.type === 'columnrange')) {
1728 < vertexes.length; i++) {< bbox3d.maxX) { var series = this,
1729 < vertexes.length; i++) {< bbox3d.maxX) { chart = series.chart;
1730  
1731 < vertexes.length; i++) {< bbox3d.maxX) { var args = arguments,
1732 < vertexes.length; i++) {< bbox3d.maxX) { alignTo = args[4];
1733  
1734 < vertexes.length; i++) {< bbox3d.maxX) { var pos = ({
1735 < vertexes.length; i++) {< bbox3d.maxX) { x: alignTo.x,
1736 < vertexes.length; i++) {< bbox3d.maxX) { y: alignTo.y,
1737 < vertexes.length; i++) {< bbox3d.maxX) { z: series.z
1738 < vertexes.length; i++) {< bbox3d.maxX) { });
1739 < vertexes.length; i++) {< bbox3d.maxX) { pos = perspective([pos], chart, true)[0];
1740 < vertexes.length; i++) {< bbox3d.maxX) { alignTo.x = pos.x;
1741 < vertexes.length; i++) {< bbox3d.maxX) { alignTo.y = pos.y;
1742 < vertexes.length; i++) {< bbox3d.maxX) { }
1743  
1744 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1745 < vertexes.length; i++) {< bbox3d.maxX) { });
1746  
1747 < vertexes.length; i++) {< bbox3d.maxX) { if (seriesTypes.columnrange) {
1748 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.columnrange.prototype, 'drawPoints', draw3DPoints);
1749 < vertexes.length; i++) {< bbox3d.maxX) { }
1750  
1751 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.column.prototype, 'drawPoints', draw3DPoints);
1752  
1753 < vertexes.length; i++) {< bbox3d.maxX) { /***
1754 < vertexes.length; i++) {< bbox3d.maxX) { EXTENSION FOR 3D CYLINDRICAL COLUMNS
1755 < vertexes.length; i++) {< bbox3d.maxX) { Not supported
1756 < vertexes.length; i++) {< bbox3d.maxX) { ***/
1757 < vertexes.length; i++) {< bbox3d.maxX) { /*
1758 < vertexes.length; i++) {< bbox3d.maxX) { var defaultOptions = H.getOptions();
1759 < vertexes.length; i++) {< bbox3d.maxX) { defaultOptions.plotOptions.cylinder = H.merge(defaultOptions.plotOptions.column);
1760 < vertexes.length; i++) {< bbox3d.maxX) { var CylinderSeries = H.extendClass(seriesTypes.column, {
1761 < vertexes.length; i++) {< bbox3d.maxX) { type: 'cylinder'
1762 < vertexes.length; i++) {< bbox3d.maxX) { });
1763 < vertexes.length; i++) {< bbox3d.maxX) { seriesTypes.cylinder = CylinderSeries;
1764  
1765 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.cylinder.prototype, 'translate', function (proceed) {
1766 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1767  
1768 < vertexes.length; i++) {< bbox3d.maxX) { // Do not do this if the chart is not 3D
1769 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.chart.is3d()) {
1770 < vertexes.length; i++) {< bbox3d.maxX) { return;
1771 < vertexes.length; i++) {< bbox3d.maxX) { }
1772  
1773 < vertexes.length; i++) {< bbox3d.maxX) { var series = this,
1774 < vertexes.length; i++) {< bbox3d.maxX) { chart = series.chart,
1775 < vertexes.length; i++) {< bbox3d.maxX) { options = chart.options,
1776 < vertexes.length; i++) {< bbox3d.maxX) { cylOptions = options.plotOptions.cylinder,
1777 < vertexes.length; i++) {< bbox3d.maxX) { options3d = options.chart.options3d,
1778 < vertexes.length; i++) {< bbox3d.maxX) { depth = cylOptions.depth || 0,
1779 < vertexes.length; i++) {< bbox3d.maxX) { alpha = chart.alpha3d;
1780  
1781 < vertexes.length; i++) {< bbox3d.maxX) { var z = cylOptions.stacking ? (this.options.stack || 0) * depth : series._i * depth;
1782 < vertexes.length; i++) {< bbox3d.maxX) { z += depth / 2;
1783  
1784 < vertexes.length; i++) {< bbox3d.maxX) { if (cylOptions.grouping !== false) { z = 0; }
1785  
1786 < vertexes.length; i++) {< bbox3d.maxX) { each(series.data, function (point) {
1787 < vertexes.length; i++) {< bbox3d.maxX) { var shapeArgs = point.shapeArgs,
1788 < vertexes.length; i++) {< bbox3d.maxX) { deg2rad = H.deg2rad;
1789 < vertexes.length; i++) {< bbox3d.maxX) { point.shapeType = 'arc3d';
1790 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.x += depth / 2;
1791 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.z = z;
1792 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.start = 0;
1793 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.end = 2 * PI;
1794 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.r = depth * 0.95;
1795 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.innerR = 0;
1796 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.depth = shapeArgs.height * (1 / sin((90 - alpha) * deg2rad)) - z;
1797 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.alpha = 90 - alpha;
1798 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.beta = 0;
1799 < vertexes.length; i++) {< bbox3d.maxX) { });
1800 < vertexes.length; i++) {< bbox3d.maxX) { });
1801 < vertexes.length; i++) {< bbox3d.maxX) { */
1802  
1803 < vertexes.length; i++) {< bbox3d.maxX) { }(Highcharts));
1804 < vertexes.length; i++) {< bbox3d.maxX) { (function(H) {
1805 < vertexes.length; i++) {< bbox3d.maxX) { /**
1806 < vertexes.length; i++) {< bbox3d.maxX) { * (c) 2010-2017 Torstein Honsi
1807 < vertexes.length; i++) {< bbox3d.maxX) { *
1808 < vertexes.length; i++) {< bbox3d.maxX) { * License: www.highcharts.com/license
1809 < vertexes.length; i++) {< bbox3d.maxX) { */
1810 < vertexes.length; i++) {< bbox3d.maxX) { var deg2rad = H.deg2rad,
1811 < vertexes.length; i++) {< bbox3d.maxX) { each = H.each,
1812 < vertexes.length; i++) {< bbox3d.maxX) { pick = H.pick,
1813 < vertexes.length; i++) {< bbox3d.maxX) { seriesTypes = H.seriesTypes,
1814 < vertexes.length; i++) {< bbox3d.maxX) { svg = H.svg,
1815 < vertexes.length; i++) {< bbox3d.maxX) { wrap = H.wrap;
1816  
1817 < vertexes.length; i++) {< bbox3d.maxX) { /***
1818 < vertexes.length; i++) {< bbox3d.maxX) { EXTENSION FOR 3D PIES
1819 < vertexes.length; i++) {< bbox3d.maxX) { ***/
1820  
1821 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.pie.prototype, 'translate', function(proceed) {
1822 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1823  
1824 < vertexes.length; i++) {< bbox3d.maxX) { // Do not do this if the chart is not 3D
1825 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.chart.is3d()) {
1826 < vertexes.length; i++) {< bbox3d.maxX) { return;
1827 < vertexes.length; i++) {< bbox3d.maxX) { }
1828  
1829 < vertexes.length; i++) {< bbox3d.maxX) { var series = this,
1830 < vertexes.length; i++) {< bbox3d.maxX) { seriesOptions = series.options,
1831 < vertexes.length; i++) {< bbox3d.maxX) { depth = seriesOptions.depth || 0,
1832 < vertexes.length; i++) {< bbox3d.maxX) { options3d = series.chart.options.chart.options3d,
1833 < vertexes.length; i++) {< bbox3d.maxX) { alpha = options3d.alpha,
1834 < vertexes.length; i++) {< bbox3d.maxX) { beta = options3d.beta,
1835 < vertexes.length; i++) {< bbox3d.maxX) { z = seriesOptions.stacking ? (seriesOptions.stack || 0) * depth : series._i * depth;
1836  
1837 < vertexes.length; i++) {< bbox3d.maxX) { z += depth / 2;
1838  
1839 < vertexes.length; i++) {< bbox3d.maxX) { if (seriesOptions.grouping !== false) {
1840 < vertexes.length; i++) {< bbox3d.maxX) { z = 0;
1841 < vertexes.length; i++) {< bbox3d.maxX) { }
1842  
1843 < vertexes.length; i++) {< bbox3d.maxX) { each(series.data, function(point) {
1844  
1845 < vertexes.length; i++) {< bbox3d.maxX) { var shapeArgs = point.shapeArgs,
1846 < vertexes.length; i++) {< bbox3d.maxX) { angle;
1847  
1848 < vertexes.length; i++) {< bbox3d.maxX) { point.shapeType = 'arc3d';
1849  
1850 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.z = z;
1851 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.depth = depth * 0.75;
1852 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.alpha = alpha;
1853 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.beta = beta;
1854 < vertexes.length; i++) {< bbox3d.maxX) { shapeArgs.center = series.center;
1855  
1856 < vertexes.length; i++) {< bbox3d.maxX) { angle = (shapeArgs.end + shapeArgs.start) / 2;
1857  
1858 < vertexes.length; i++) {< bbox3d.maxX) { point.slicedTranslation = {
1859 < vertexes.length; i++) {< bbox3d.maxX) { translateX: Math.round(Math.cos(angle) * seriesOptions.slicedOffset * Math.cos(alpha * deg2rad)),
1860 < vertexes.length; i++) {< bbox3d.maxX) { translateY: Math.round(Math.sin(angle) * seriesOptions.slicedOffset * Math.cos(alpha * deg2rad))
1861 < vertexes.length; i++) {< bbox3d.maxX) { };
1862 < vertexes.length; i++) {< bbox3d.maxX) { });
1863 < vertexes.length; i++) {< bbox3d.maxX) { });
1864  
1865 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.pie.prototype.pointClass.prototype, 'haloPath', function(proceed) {
1866 < vertexes.length; i++) {< bbox3d.maxX) { var args = arguments;
1867 < vertexes.length; i++) {< bbox3d.maxX) { return this.series.chart.is3d() ? [] : proceed.call(this, args[1]);
1868 < vertexes.length; i++) {< bbox3d.maxX) { });
1869  
1870  
1871  
1872 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.pie.prototype, 'drawPoints', function(proceed) {
1873 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1874  
1875 < vertexes.length; i++) {< bbox3d.maxX) { if (this.chart.is3d()) {
1876 < vertexes.length; i++) {< bbox3d.maxX) { each(this.points, function(point) {
1877 < vertexes.length; i++) {< bbox3d.maxX) { var graphic = point.graphic;
1878  
1879 < vertexes.length; i++) {< bbox3d.maxX) { // #4584 Check if has graphic - null points don't have it
1880 < vertexes.length; i++) {< bbox3d.maxX) { if (graphic) {
1881 < vertexes.length; i++) {< bbox3d.maxX) { // Hide null or 0 points (#3006, 3650)
1882 < vertexes.length; i++) {< bbox3d.maxX) { graphic[point.y && point.visible ? 'show' : 'hide']();
1883 < vertexes.length; i++) {< bbox3d.maxX) { }
1884 < vertexes.length; i++) {< bbox3d.maxX) { });
1885 < vertexes.length; i++) {< bbox3d.maxX) { }
1886 < vertexes.length; i++) {< bbox3d.maxX) { });
1887  
1888 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.pie.prototype, 'drawDataLabels', function(proceed) {
1889 < vertexes.length; i++) {< bbox3d.maxX) { if (this.chart.is3d()) {
1890 < vertexes.length; i++) {< bbox3d.maxX) { var series = this,
1891 < vertexes.length; i++) {< bbox3d.maxX) { chart = series.chart,
1892 < vertexes.length; i++) {< bbox3d.maxX) { options3d = chart.options.chart.options3d;
1893 < vertexes.length; i++) {< bbox3d.maxX) { each(series.data, function(point) {
1894 < vertexes.length; i++) {< bbox3d.maxX) { var shapeArgs = point.shapeArgs,
1895 < vertexes.length; i++) {< bbox3d.maxX) { r = shapeArgs.r,
1896 < vertexes.length; i++) {< bbox3d.maxX) { a1 = (shapeArgs.alpha || options3d.alpha) * deg2rad, //#3240 issue with datalabels for 0 and null values
1897 < vertexes.length; i++) {< bbox3d.maxX) { b1 = (shapeArgs.beta || options3d.beta) * deg2rad,
1898 < vertexes.length; i++) {< bbox3d.maxX) { a2 = (shapeArgs.start + shapeArgs.end) / 2,
1899 < vertexes.length; i++) {< bbox3d.maxX) { labelPos = point.labelPos,
1900 < vertexes.length; i++) {< bbox3d.maxX) { labelIndexes = [0, 2, 4], // [x1, y1, x2, y2, x3, y3]
1901 < vertexes.length; i++) {< bbox3d.maxX) { yOffset = (-r * (1 - Math.cos(a1)) * Math.sin(a2)), // + (sin(a2) > 0 ? sin(a1) * d : 0)
1902 < vertexes.length; i++) {< bbox3d.maxX) { xOffset = r * (Math.cos(b1) - 1) * Math.cos(a2);
1903  
1904 < vertexes.length; i++) {< bbox3d.maxX) { // Apply perspective on label positions
1905 < vertexes.length; i++) {< bbox3d.maxX) { each(labelIndexes, function(index) {
1906 < vertexes.length; i++) {< bbox3d.maxX) { labelPos[index] += xOffset;
1907 < vertexes.length; i++) {< bbox3d.maxX) { labelPos[index + 1] += yOffset;
1908 < vertexes.length; i++) {< bbox3d.maxX) { });
1909 < vertexes.length; i++) {< bbox3d.maxX) { });
1910 < vertexes.length; i++) {< bbox3d.maxX) { }
1911  
1912 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1913 < vertexes.length; i++) {< bbox3d.maxX) { });
1914  
1915 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.pie.prototype, 'addPoint', function(proceed) {
1916 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1917 < vertexes.length; i++) {< bbox3d.maxX) { if (this.chart.is3d()) {
1918 < vertexes.length; i++) {< bbox3d.maxX) { // destroy (and rebuild) everything!!!
1919 < vertexes.length; i++) {< bbox3d.maxX) { this.update(this.userOptions, true); // #3845 pass the old options
1920 < vertexes.length; i++) {< bbox3d.maxX) { }
1921 < vertexes.length; i++) {< bbox3d.maxX) { });
1922  
1923 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.pie.prototype, 'animate', function(proceed) {
1924 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.chart.is3d()) {
1925 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
1926 < vertexes.length; i++) {< bbox3d.maxX) { } else {
1927 < vertexes.length; i++) {< bbox3d.maxX) { var args = arguments,
1928 < vertexes.length; i++) {< bbox3d.maxX) { init = args[1],
1929 < vertexes.length; i++) {< bbox3d.maxX) { animation = this.options.animation,
1930 < vertexes.length; i++) {< bbox3d.maxX) { attribs,
1931 < vertexes.length; i++) {< bbox3d.maxX) { center = this.center,
1932 < vertexes.length; i++) {< bbox3d.maxX) { group = this.group,
1933 < vertexes.length; i++) {< bbox3d.maxX) { markerGroup = this.markerGroup;
1934  
1935 < vertexes.length; i++) {< bbox3d.maxX) { if (svg) { // VML is too slow anyway
1936  
1937 < vertexes.length; i++) {< bbox3d.maxX) { if (animation === true) {
1938 < vertexes.length; i++) {< bbox3d.maxX) { animation = {};
1939 < vertexes.length; i++) {< bbox3d.maxX) { }
1940 < vertexes.length; i++) {< bbox3d.maxX) { // Initialize the animation
1941 < vertexes.length; i++) {< bbox3d.maxX) { if (init) {
1942  
1943 < vertexes.length; i++) {< bbox3d.maxX) { // Scale down the group and place it in the center
1944 < vertexes.length; i++) {< bbox3d.maxX) { group.oldtranslateX = group.translateX;
1945 < vertexes.length; i++) {< bbox3d.maxX) { group.oldtranslateY = group.translateY;
1946 < vertexes.length; i++) {< bbox3d.maxX) { attribs = {
1947 < vertexes.length; i++) {< bbox3d.maxX) { translateX: center[0],
1948 < vertexes.length; i++) {< bbox3d.maxX) { translateY: center[1],
1949 < vertexes.length; i++) {< bbox3d.maxX) { scaleX: 0.001, // #1499
1950 < vertexes.length; i++) {< bbox3d.maxX) { scaleY: 0.001
1951 < vertexes.length; i++) {< bbox3d.maxX) { };
1952  
1953 < vertexes.length; i++) {< bbox3d.maxX) { group.attr(attribs);
1954 < vertexes.length; i++) {< bbox3d.maxX) { if (markerGroup) {
1955 < vertexes.length; i++) {< bbox3d.maxX) { markerGroup.attrSetters = group.attrSetters;
1956 < vertexes.length; i++) {< bbox3d.maxX) { markerGroup.attr(attribs);
1957 < vertexes.length; i++) {< bbox3d.maxX) { }
1958  
1959 < vertexes.length; i++) {< bbox3d.maxX) { // Run the animation
1960 < vertexes.length; i++) {< bbox3d.maxX) { } else {
1961 < vertexes.length; i++) {< bbox3d.maxX) { attribs = {
1962 < vertexes.length; i++) {< bbox3d.maxX) { translateX: group.oldtranslateX,
1963 < vertexes.length; i++) {< bbox3d.maxX) { translateY: group.oldtranslateY,
1964 < vertexes.length; i++) {< bbox3d.maxX) { scaleX: 1,
1965 < vertexes.length; i++) {< bbox3d.maxX) { scaleY: 1
1966 < vertexes.length; i++) {< bbox3d.maxX) { };
1967 < vertexes.length; i++) {< bbox3d.maxX) { group.animate(attribs, animation);
1968  
1969 < vertexes.length; i++) {< bbox3d.maxX) { if (markerGroup) {
1970 < vertexes.length; i++) {< bbox3d.maxX) { markerGroup.animate(attribs, animation);
1971 < vertexes.length; i++) {< bbox3d.maxX) { }
1972  
1973 < vertexes.length; i++) {< bbox3d.maxX) { // Delete this function to allow it only once
1974 < vertexes.length; i++) {< bbox3d.maxX) { this.animate = null;
1975 < vertexes.length; i++) {< bbox3d.maxX) { }
1976  
1977 < vertexes.length; i++) {< bbox3d.maxX) { }
1978 < vertexes.length; i++) {< bbox3d.maxX) { }
1979 < vertexes.length; i++) {< bbox3d.maxX) { });
1980  
1981 < vertexes.length; i++) {< bbox3d.maxX) { }(Highcharts));
1982 < vertexes.length; i++) {< bbox3d.maxX) { (function(H) {
1983 < vertexes.length; i++) {< bbox3d.maxX) { /**
1984 < vertexes.length; i++) {< bbox3d.maxX) { * (c) 2010-2017 Torstein Honsi
1985 < vertexes.length; i++) {< bbox3d.maxX) { *
1986 < vertexes.length; i++) {< bbox3d.maxX) { * License: www.highcharts.com/license
1987 < vertexes.length; i++) {< bbox3d.maxX) { */
1988 < vertexes.length; i++) {< bbox3d.maxX) { var perspective = H.perspective,
1989 < vertexes.length; i++) {< bbox3d.maxX) { pick = H.pick,
1990 < vertexes.length; i++) {< bbox3d.maxX) { Point = H.Point,
1991 < vertexes.length; i++) {< bbox3d.maxX) { seriesTypes = H.seriesTypes,
1992 < vertexes.length; i++) {< bbox3d.maxX) { wrap = H.wrap;
1993  
1994 < vertexes.length; i++) {< bbox3d.maxX) { /***
1995 < vertexes.length; i++) {< bbox3d.maxX) { EXTENSION FOR 3D SCATTER CHART
1996 < vertexes.length; i++) {< bbox3d.maxX) { ***/
1997  
1998 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.scatter.prototype, 'translate', function(proceed) {
1999 < vertexes.length; i++) {< bbox3d.maxX) { //function translate3d(proceed) {
2000 < vertexes.length; i++) {< bbox3d.maxX) { proceed.apply(this, [].slice.call(arguments, 1));
2001  
2002 < vertexes.length; i++) {< bbox3d.maxX) { if (!this.chart.is3d()) {
2003 < vertexes.length; i++) {< bbox3d.maxX) { return;
2004 < vertexes.length; i++) {< bbox3d.maxX) { }
2005  
2006 < vertexes.length; i++) {< bbox3d.maxX) { var series = this,
2007 < vertexes.length; i++) {< bbox3d.maxX) { chart = series.chart,
2008 < vertexes.length; i++) {< bbox3d.maxX) { zAxis = pick(series.zAxis, chart.options.zAxis[0]),
2009 < vertexes.length; i++) {< bbox3d.maxX) { rawPoints = [],
2010 < vertexes.length; i++) {< bbox3d.maxX) { rawPoint,
2011 < vertexes.length; i++) {< bbox3d.maxX) { projectedPoints,
2012 < vertexes.length; i++) {< bbox3d.maxX) { projectedPoint,
2013 < vertexes.length; i++) {< bbox3d.maxX) { zValue,
2014 < vertexes.length; i++) {< bbox3d.maxX) { i;
2015  
2016 < vertexes.length; i++) {< bbox3d.maxX) { for (i = 0; i < series.data.length; i++) {
2017 < vertexes.length; i++) {< bbox3d.maxX) { rawPoint = series.data[i];
2018 < vertexes.length; i++) {< bbox3d.maxX) { zValue = zAxis.isLog && zAxis.val2lin ? zAxis.val2lin(rawPoint.z) : rawPoint.z; // #4562
2019 < vertexes.length; i++) {< bbox3d.maxX) { rawPoint.plotZ = zAxis.translate(zValue);
2020  
2021 < vertexes.length; i++) {< bbox3d.maxX) { rawPoint.isInside = rawPoint.isInside ? (zValue >= zAxis.min && zValue <= zAxis.max) : false;
2022  
2023 < vertexes.length; i++) {< bbox3d.maxX) { rawPoints.push({
2024 < vertexes.length; i++) {< bbox3d.maxX) { x: rawPoint.plotX,
2025 < vertexes.length; i++) {< bbox3d.maxX) { y: rawPoint.plotY,
2026 < vertexes.length; i++) {< bbox3d.maxX) { z: rawPoint.plotZ
2027 < vertexes.length; i++) {< bbox3d.maxX) { });
2028 < vertexes.length; i++) {< bbox3d.maxX) { }
2029  
2030 < vertexes.length; i++) {< bbox3d.maxX) { projectedPoints = perspective(rawPoints, chart, true);
2031  
2032 < vertexes.length; i++) {< bbox3d.maxX) { for (i = 0; i < series.data.length; i++) {
2033 < vertexes.length; i++) {< bbox3d.maxX) { rawPoint = series.data[i];
2034 < vertexes.length; i++) {< bbox3d.maxX) { projectedPoint = projectedPoints[i];
2035  
2036 < vertexes.length; i++) {< bbox3d.maxX) { rawPoint.plotXold = rawPoint.plotX;
2037 < vertexes.length; i++) {< bbox3d.maxX) { rawPoint.plotYold = rawPoint.plotY;
2038 < vertexes.length; i++) {< bbox3d.maxX) { rawPoint.plotZold = rawPoint.plotZ;
2039  
2040 < vertexes.length; i++) {< bbox3d.maxX) { rawPoint.plotX = projectedPoint.x;
2041 < vertexes.length; i++) {< bbox3d.maxX) { rawPoint.plotY = projectedPoint.y;
2042 < vertexes.length; i++) {< bbox3d.maxX) { rawPoint.plotZ = projectedPoint.z;
2043  
2044 < vertexes.length; i++) {< bbox3d.maxX) { }
2045  
2046 < vertexes.length; i++) {< bbox3d.maxX) { });
2047  
2048  
2049 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.scatter.prototype, 'init', function(proceed, chart, options) {
2050 < vertexes.length; i++) {< bbox3d.maxX) { if (chart.is3d()) {
2051 < vertexes.length; i++) {< bbox3d.maxX) { // add a third coordinate
2052 < vertexes.length; i++) {< bbox3d.maxX) { this.axisTypes = ['xAxis', 'yAxis', 'zAxis'];
2053 < vertexes.length; i++) {< bbox3d.maxX) { this.pointArrayMap = ['x', 'y', 'z'];
2054 < vertexes.length; i++) {< bbox3d.maxX) { this.parallelArrays = ['x', 'y', 'z'];
2055  
2056 < vertexes.length; i++) {< bbox3d.maxX) { // Require direct touch rather than using the k-d-tree, because the k-d-tree currently doesn't
2057 < vertexes.length; i++) {< bbox3d.maxX) { // take the xyz coordinate system into account (#4552)
2058 < vertexes.length; i++) {< bbox3d.maxX) { this.directTouch = true;
2059 < vertexes.length; i++) {< bbox3d.maxX) { }
2060  
2061 < vertexes.length; i++) {< bbox3d.maxX) { var result = proceed.apply(this, [chart, options]);
2062  
2063 < vertexes.length; i++) {< bbox3d.maxX) { if (this.chart.is3d()) {
2064 < vertexes.length; i++) {< bbox3d.maxX) { // Set a new default tooltip formatter
2065 < vertexes.length; i++) {< bbox3d.maxX) { var default3dScatterTooltip = 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>';
2066 < vertexes.length; i++) {< bbox3d.maxX) { if (this.userOptions.tooltip) {
2067 < vertexes.length; i++) {< bbox3d.maxX) { this.tooltipOptions.pointFormat = this.userOptions.tooltip.pointFormat || default3dScatterTooltip;
2068 < vertexes.length; i++) {< bbox3d.maxX) { } else {
2069 < vertexes.length; i++) {< bbox3d.maxX) { this.tooltipOptions.pointFormat = default3dScatterTooltip;
2070 < vertexes.length; i++) {< bbox3d.maxX) { }
2071 < vertexes.length; i++) {< bbox3d.maxX) { }
2072 < vertexes.length; i++) {< bbox3d.maxX) { return result;
2073 < vertexes.length; i++) {< bbox3d.maxX) { });
2074  
2075 < vertexes.length; i++) {< bbox3d.maxX) { /**
2076 < vertexes.length; i++) {< bbox3d.maxX) { * Updating zIndex for every point - based on the distance from point to camera
2077 < vertexes.length; i++) {< bbox3d.maxX) { */
2078 < vertexes.length; i++) {< bbox3d.maxX) { wrap(seriesTypes.scatter.prototype, 'pointAttribs', function(proceed, point) {
2079 < vertexes.length; i++) {< bbox3d.maxX) { var pointOptions = proceed.apply(this, [].slice.call(arguments, 1));
2080 < vertexes.length; i++) {< bbox3d.maxX) { if (this.chart.is3d() && point) {
2081 < vertexes.length; i++) {< bbox3d.maxX) { pointOptions.zIndex = H.pointCameraDistance(point, this.chart);
2082 < vertexes.length; i++) {< bbox3d.maxX) { }
2083 < vertexes.length; i++) {< bbox3d.maxX) { return pointOptions;
2084 < vertexes.length; i++) {< bbox3d.maxX) { });
2085  
2086  
2087 < vertexes.length; i++) {< bbox3d.maxX) { wrap(Point.prototype, 'applyOptions', function(proceed) {
2088 < vertexes.length; i++) {< bbox3d.maxX) { var point = proceed.apply(this, [].slice.call(arguments, 1));
2089  
2090 < vertexes.length; i++) {< bbox3d.maxX) { if (this.series.chart.is3d() && point.z === undefined) {
2091 < vertexes.length; i++) {< bbox3d.maxX) { point.z = 0;
2092 < vertexes.length; i++) {< bbox3d.maxX) { }
2093 < vertexes.length; i++) {< bbox3d.maxX) { return point;
2094 < vertexes.length; i++) {< bbox3d.maxX) { });
2095  
2096 < vertexes.length; i++) {< bbox3d.maxX) { }(Highcharts));
2097 < vertexes.length; i++) {< bbox3d.maxX) { (function(H) {
2098 < vertexes.length; i++) {< bbox3d.maxX) { /**
2099 < vertexes.length; i++) {< bbox3d.maxX) { * (c) 2010-2017 Torstein Honsi
2100 < vertexes.length; i++) {< bbox3d.maxX) { *
2101 < vertexes.length; i++) {< bbox3d.maxX) { * License: www.highcharts.com/license
2102 < vertexes.length; i++) {< bbox3d.maxX) { */
2103  
2104  
2105 < vertexes.length; i++) {< bbox3d.maxX) { }(Highcharts));
2106 < vertexes.length; i++) {< bbox3d.maxX) {}));