Subversion-Projekte lars-tiefland.ci

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
875 lars 1
/**
2
 * Highcharts JS v4.1.8 (2015-08-20)
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
			if (info && info.totalRange >= axis.closestPointRange) {
82
				return;
83
			}
84
 
85
			for (i = 0; i < tickPositions.length; i++) {
86
				if (!axis.isInAnyBreak(tickPositions[i])) {
87
					newPositions.push(tickPositions[i]);
88
				}
89
			}
90
 
91
			this.tickPositions = newPositions;
92
			this.tickPositions.info = info;
93
		}
94
	});
95
 
96
	wrap(Axis.prototype, 'init', function (proceed, chart, userOptions) {
97
		// Force Axis to be not-ordinal when breaks are defined
98
		if (userOptions.breaks && userOptions.breaks.length) {
99
			userOptions.ordinal = false;
100
		}
101
 
102
		proceed.call(this, chart, userOptions);
103
 
104
		if (this.options.breaks) {
105
 
106
			var axis = this;
107
 
108
			axis.doPostTranslate = true;
109
 
110
			this.val2lin = function (val) {
111
				var nval = val,
112
					brk,
113
					i;
114
 
115
				for (i = 0; i < axis.breakArray.length; i++) {
116
					brk = axis.breakArray[i];
117
					if (brk.to <= val) {
118
						nval -= brk.len;
119
					} else if (brk.from >= val) {
120
						break;
121
					} else if (axis.isInBreak(brk, val)) {
122
						nval -= (val - brk.from);
123
						break;
124
					}
125
				}
126
 
127
				return nval;
128
			};
129
 
130
			this.lin2val = function (val) {
131
				var nval = val,
132
					brk,
133
					i;
134
 
135
				for (i = 0; i < axis.breakArray.length; i++) {
136
					brk = axis.breakArray[i];
137
					if (brk.from >= nval) {
138
						break;
139
					} else if (brk.to < nval) {
140
						nval += brk.len;
141
					} else if (axis.isInBreak(brk, nval)) {
142
						nval += brk.len;
143
					}
144
				}
145
				return nval;
146
			};
147
 
148
			this.setExtremes = function (newMin, newMax, redraw, animation, eventArguments) {
149
				// If trying to set extremes inside a break, extend it to before and after the break ( #3857 )
150
				while (this.isInAnyBreak(newMin)) {
151
					newMin -= this.closestPointRange;
152
				}
153
				while (this.isInAnyBreak(newMax)) {
154
					newMax -= this.closestPointRange;
155
				}
156
				Axis.prototype.setExtremes.call(this, newMin, newMax, redraw, animation, eventArguments);
157
			};
158
 
159
			this.setAxisTranslation = function (saveOld) {
160
				Axis.prototype.setAxisTranslation.call(this, saveOld);
161
 
162
				var breaks = axis.options.breaks,
163
					breakArrayT = [],	// Temporary one
164
					breakArray = [],
165
					length = 0,
166
					inBrk,
167
					repeat,
168
					brk,
169
					min = axis.userMin || axis.min,
170
					max = axis.userMax || axis.max,
171
					start,
172
					i,
173
					j;
174
 
175
				// Min & max check (#4247)
176
				for (i in breaks) {
177
					brk = breaks[i];
178
					repeat = brk.repeat || Infinity;
179
					if (axis.isInBreak(brk, min)) {
180
						min += (brk.to % repeat) - (min % repeat);
181
					}
182
					if (axis.isInBreak(brk, max)) {
183
						max -= (max % repeat) - (brk.from % repeat);
184
					}
185
				}
186
 
187
				// Construct an array holding all breaks in the axis
188
				for (i in breaks) {
189
					brk = breaks[i];
190
					start = brk.from;
191
					repeat = brk.repeat || Infinity;
192
 
193
					while (start - repeat > min) {
194
						start -= repeat;
195
					}
196
					while (start < min) {
197
						start += repeat;
198
					}
199
 
200
					for (j = start; j < max; j += repeat) {
201
						breakArrayT.push({
202
							value: j,
203
							move: 'in'
204
						});
205
						breakArrayT.push({
206
							value: j + (brk.to - brk.from),
207
							move: 'out',
208
							size: brk.breakSize
209
						});
210
					}
211
				}
212
 
213
				breakArrayT.sort(function (a, b) {
214
					if (a.value === b.value) {
215
						return (a.move === 'in' ? 0 : 1) - (b.move === 'in' ? 0 : 1);
216
					} else {
217
						return a.value - b.value;
218
					}
219
				});
220
 
221
				// Simplify the breaks
222
				inBrk = 0;
223
				start = min;
224
 
225
				for (i in breakArrayT) {
226
					brk = breakArrayT[i];
227
					inBrk += (brk.move === 'in' ? 1 : -1);
228
 
229
					if (inBrk === 1 && brk.move === 'in') {
230
						start = brk.value;
231
					}
232
					if (inBrk === 0) {
233
						breakArray.push({
234
							from: start,
235
							to: brk.value,
236
							len: brk.value - start - (brk.size || 0)
237
						});
238
						length += brk.value - start - (brk.size || 0);
239
					}
240
				}
241
 
242
				axis.breakArray = breakArray;
243
 
244
				fireEvent(axis, 'afterBreaks');
245
 
246
				axis.transA *= ((max - axis.min) / (max - min - length));
247
 
248
				axis.min = min;
249
				axis.max = max;
250
			};
251
		}
252
	});
253
 
254
	wrap(Series.prototype, 'generatePoints', function (proceed) {
255
 
256
		proceed.apply(this, stripArguments(arguments));
257
 
258
		var series = this,
259
			xAxis = series.xAxis,
260
			yAxis = series.yAxis,
261
			points = series.points,
262
			point,
263
			i = points.length,
264
			connectNulls = series.options.connectNulls,
265
			nullGap;
266
 
267
 
268
		if (xAxis && yAxis && (xAxis.options.breaks || yAxis.options.breaks)) {
269
			while (i--) {
270
				point = points[i];
271
 
272
				nullGap = point.y === null && connectNulls === false; // respect nulls inside the break (#4275)
273
				if (!nullGap && (xAxis.isInAnyBreak(point.x, true) || yAxis.isInAnyBreak(point.y, true))) {
274
					points.splice(i, 1);
275
					if (this.data[i]) {
276
						this.data[i].destroyElements(); // removes the graphics for this point if they exist
277
					}
278
				}
279
			}
280
		}
281
 
282
	});
283
 
284
	wrap(H.seriesTypes.column.prototype, 'drawPoints', function (proceed) {
285
		proceed.apply(this);
286
 
287
		var series = this,
288
			points = series.points,
289
			yAxis = series.yAxis,
290
			breaks = yAxis.breakArray || [],
291
			threshold = pick(this.options.threshold, yAxis.min),
292
			eventName,
293
			point,
294
			brk,
295
			i,
296
			j,
297
			y;
298
 
299
		for (i = 0; i < points.length; i++) {
300
			point = points[i];
301
			y = point.stackY || point.y;
302
			for (j = 0; j < breaks.length; j++) {
303
				brk = breaks[j];
304
				eventName = false;
305
 
306
				if ((threshold < brk.from && y > brk.to) || (threshold > brk.from && y < brk.from)) {
307
						eventName = 'pointBreak';
308
				} 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
309
						eventName = 'pointInBreak'; // docs
310
				}
311
				if (eventName) {
312
					fireEvent(yAxis, eventName, {point: point, brk: brk});
313
				}
314
			}
315
		}
316
 
317
	});
318
}(Highcharts));