Subversion-Projekte lars-tiefland.ci

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
776 lars 1
/**
2
 * Highcharts JS v4.1.9 (2015-10-07)
3
 * Highcharts Broken Axis module
4
 *
5
 * Author: Stephane Vanraes, Torstein Honsi
6
 * License: www.highcharts.com/license
7
 */
8
 
9
/*global HighchartsAdapter*/
10
(function (H) {
11
 
12
	"use strict";
13
 
14
	var pick = H.pick,
15
		wrap = H.wrap,
16
		extend = H.extend,
17
		fireEvent = HighchartsAdapter.fireEvent,
18
		Axis = H.Axis,
19
		Series = H.Series;
20
 
21
	function stripArguments() {
22
		return Array.prototype.slice.call(arguments, 1);
23
	}
24
 
25
	extend(Axis.prototype, {
26
		isInBreak: function (brk, val) {
27
			var ret,
28
				repeat = brk.repeat || Infinity,
29
				from = brk.from,
30
				length = brk.to - brk.from,
31
				test = (val >= from ? (val - from) % repeat :  repeat - ((from - val) % repeat));
32
 
33
			if (!brk.inclusive) {
34
				ret = test < length && test !== 0;
35
			} else {
36
				ret = test <= length;
37
			}
38
			return ret;
39
		},
40
 
41
		isInAnyBreak: function (val, testKeep) {
42
 
43
			var breaks = this.options.breaks,
44
				i = breaks && breaks.length,
45
				inbrk,
46
				keep,
47
				ret;
48
 
49
 
50
			if (i) {
51
 
52
				while (i--) {
53
					if (this.isInBreak(breaks[i], val)) {
54
						inbrk = true;
55
						if (!keep) {
56
							keep = pick(breaks[i].showPoints, this.isXAxis ? false : true);
57
						}
58
					}
59
				}
60
 
61
				if (inbrk && testKeep) {
62
					ret = inbrk && !keep;
63
				} else {
64
					ret = inbrk;
65
				}
66
			}
67
			return ret;
68
		}
69
	});
70
 
71
	wrap(Axis.prototype, 'setTickPositions', function (proceed) {
72
		proceed.apply(this, Array.prototype.slice.call(arguments, 1));
73
 
74
		if (this.options.breaks) {
75
			var axis = this,
76
				tickPositions = this.tickPositions,
77
				info = this.tickPositions.info,
78
				newPositions = [],
79
				i;
80
 
81
			for (i = 0; i < tickPositions.length; i++) {
82
				if (!axis.isInAnyBreak(tickPositions[i])) {
83
					newPositions.push(tickPositions[i]);
84
				}
85
			}
86
 
87
			this.tickPositions = newPositions;
88
			this.tickPositions.info = info;
89
		}
90
	});
91
 
92
	wrap(Axis.prototype, 'init', function (proceed, chart, userOptions) {
93
		// Force Axis to be not-ordinal when breaks are defined
94
		if (userOptions.breaks && userOptions.breaks.length) {
95
			userOptions.ordinal = false;
96
		}
97
 
98
		proceed.call(this, chart, userOptions);
99
 
100
		if (this.options.breaks) {
101
 
102
			var axis = this;
103
 
104
			axis.doPostTranslate = true;
105
 
106
			this.val2lin = function (val) {
107
				var nval = val,
108
					brk,
109
					i;
110
 
111
				for (i = 0; i < axis.breakArray.length; i++) {
112
					brk = axis.breakArray[i];
113
					if (brk.to <= val) {
114
						nval -= brk.len;
115
					} else if (brk.from >= val) {
116
						break;
117
					} else if (axis.isInBreak(brk, val)) {
118
						nval -= (val - brk.from);
119
						break;
120
					}
121
				}
122
 
123
				return nval;
124
			};
125
 
126
			this.lin2val = function (val) {
127
				var nval = val,
128
					brk,
129
					i;
130
 
131
				for (i = 0; i < axis.breakArray.length; i++) {
132
					brk = axis.breakArray[i];
133
					if (brk.from >= nval) {
134
						break;
135
					} else if (brk.to < nval) {
136
						nval += brk.len;
137
					} else if (axis.isInBreak(brk, nval)) {
138
						nval += brk.len;
139
					}
140
				}
141
				return nval;
142
			};
143
 
144
			this.setExtremes = function (newMin, newMax, redraw, animation, eventArguments) {
145
				// If trying to set extremes inside a break, extend it to before and after the break ( #3857 )
146
				while (this.isInAnyBreak(newMin)) {
147
					newMin -= this.closestPointRange;
148
				}
149
				while (this.isInAnyBreak(newMax)) {
150
					newMax -= this.closestPointRange;
151
				}
152
				Axis.prototype.setExtremes.call(this, newMin, newMax, redraw, animation, eventArguments);
153
			};
154
 
155
			this.setAxisTranslation = function (saveOld) {
156
				Axis.prototype.setAxisTranslation.call(this, saveOld);
157
 
158
				var breaks = axis.options.breaks,
159
					breakArrayT = [],	// Temporary one
160
					breakArray = [],
161
					length = 0,
162
					inBrk,
163
					repeat,
164
					brk,
165
					min = axis.userMin || axis.min,
166
					max = axis.userMax || axis.max,
167
					start,
168
					i,
169
					j;
170
 
171
				// Min & max check (#4247)
172
				for (i in breaks) {
173
					brk = breaks[i];
174
					repeat = brk.repeat || Infinity;
175
					if (axis.isInBreak(brk, min)) {
176
						min += (brk.to % repeat) - (min % repeat);
177
					}
178
					if (axis.isInBreak(brk, max)) {
179
						max -= (max % repeat) - (brk.from % repeat);
180
					}
181
				}
182
 
183
				// Construct an array holding all breaks in the axis
184
				for (i in breaks) {
185
					brk = breaks[i];
186
					start = brk.from;
187
					repeat = brk.repeat || Infinity;
188
 
189
					while (start - repeat > min) {
190
						start -= repeat;
191
					}
192
					while (start < min) {
193
						start += repeat;
194
					}
195
 
196
					for (j = start; j < max; j += repeat) {
197
						breakArrayT.push({
198
							value: j,
199
							move: 'in'
200
						});
201
						breakArrayT.push({
202
							value: j + (brk.to - brk.from),
203
							move: 'out',
204
							size: brk.breakSize
205
						});
206
					}
207
				}
208
 
209
				breakArrayT.sort(function (a, b) {
210
					if (a.value === b.value) {
211
						return (a.move === 'in' ? 0 : 1) - (b.move === 'in' ? 0 : 1);
212
					} else {
213
						return a.value - b.value;
214
					}
215
				});
216
 
217
				// Simplify the breaks
218
				inBrk = 0;
219
				start = min;
220
 
221
				for (i in breakArrayT) {
222
					brk = breakArrayT[i];
223
					inBrk += (brk.move === 'in' ? 1 : -1);
224
 
225
					if (inBrk === 1 && brk.move === 'in') {
226
						start = brk.value;
227
					}
228
					if (inBrk === 0) {
229
						breakArray.push({
230
							from: start,
231
							to: brk.value,
232
							len: brk.value - start - (brk.size || 0)
233
						});
234
						length += brk.value - start - (brk.size || 0);
235
					}
236
				}
237
 
238
				axis.breakArray = breakArray;
239
 
240
				fireEvent(axis, 'afterBreaks');
241
 
242
				axis.transA *= ((max - axis.min) / (max - min - length));
243
 
244
				axis.min = min;
245
				axis.max = max;
246
			};
247
		}
248
	});
249
 
250
	wrap(Series.prototype, 'generatePoints', function (proceed) {
251
 
252
		proceed.apply(this, stripArguments(arguments));
253
 
254
		var series = this,
255
			xAxis = series.xAxis,
256
			yAxis = series.yAxis,
257
			points = series.points,
258
			point,
259
			i = points.length,
260
			connectNulls = series.options.connectNulls,
261
			nullGap;
262
 
263
 
264
		if (xAxis && yAxis && (xAxis.options.breaks || yAxis.options.breaks)) {
265
			while (i--) {
266
				point = points[i];
267
 
268
				nullGap = point.y === null && connectNulls === false; // respect nulls inside the break (#4275)
269
				if (!nullGap && (xAxis.isInAnyBreak(point.x, true) || yAxis.isInAnyBreak(point.y, true))) {
270
					points.splice(i, 1);
271
					if (this.data[i]) {
272
						this.data[i].destroyElements(); // removes the graphics for this point if they exist
273
					}
274
				}
275
			}
276
		}
277
 
278
	});
279
 
280
	wrap(H.seriesTypes.column.prototype, 'drawPoints', function (proceed) {
281
		proceed.apply(this);
282
 
283
		var series = this,
284
			points = series.points,
285
			yAxis = series.yAxis,
286
			breaks = yAxis.breakArray || [],
287
			threshold = pick(this.options.threshold, yAxis.min),
288
			eventName,
289
			point,
290
			brk,
291
			i,
292
			j,
293
			y;
294
 
295
		for (i = 0; i < points.length; i++) {
296
			point = points[i];
297
			y = point.stackY || point.y;
298
			for (j = 0; j < breaks.length; j++) {
299
				brk = breaks[j];
300
				eventName = false;
301
 
302
				if ((threshold < brk.from && y > brk.to) || (threshold > brk.from && y < brk.from)) {
303
						eventName = 'pointBreak';
304
				} else if ((threshold < brk.from && y > brk.from && y < brk.to) || (threshold > brk.from && y > brk.to && y < brk.from)) { // point falls inside the break
305
						eventName = 'pointInBreak'; // docs
306
				}
307
				if (eventName) {
308
					fireEvent(yAxis, eventName, {point: point, brk: brk});
309
				}
310
			}
311
		}
312
 
313
	});
314
}(Highcharts));