html/scripts/highchart/highcharts-more.src.js
function () {
		
		var data = this.data,
			length = data.length,
			i,
			originalDataLabels = [],
			seriesProto = Series.prototype,
			dataLabelOptions = this.options.dataLabels,
			align = dataLabelOptions.align,
			point,
			inverted = this.chart.inverted;
			
		if (dataLabelOptions.enabled || this._hasPointLabels) {
			
			// Step 1: set preliminary values for plotY and dataLabel and draw the upper labels
			i = length;
			while (i--) {
				point = data[i];
				
				// Set preliminary values
				point.y = point.high;
				point._plotY = point.plotY;
				point.plotY = point.plotHigh;
				
				// Store original data labels and set preliminary label objects to be picked up 
				// in the uber method
				originalDataLabels[i] = point.dataLabel;
				point.dataLabel = point.dataLabelUpper;
				
				// Set the default offset
				point.below = false;
				if (inverted) {
					if (!align) {
						dataLabelOptions.align = 'left';
					}
					dataLabelOptions.x = dataLabelOptions.xHigh;								
				} else {
					dataLabelOptions.y = dataLabelOptions.yHigh;
				}
			}
			
			if (seriesProto.drawDataLabels) {
				seriesProto.drawDataLabels.apply(this, arguments); // #1209
			}
			
			// Step 2: reorganize and handle data labels for the lower values
			i = length;
			while (i--) {
				point = data[i];
				
				// Move the generated labels from step 1, and reassign the original data labels
				point.dataLabelUpper = point.dataLabel;
				point.dataLabel = originalDataLabels[i];
				
				// Reset values
				point.y = point.low;
				point.plotY = point._plotY;
				
				// Set the default offset
				point.below = true;
				if (inverted) {
					if (!align) {
						dataLabelOptions.align = 'right';
					}
					dataLabelOptions.x = dataLabelOptions.xLow;
				} else {
					dataLabelOptions.y = dataLabelOptions.yLow;
				}
			}
			if (seriesProto.drawDataLabels) {
				seriesProto.drawDataLabels.apply(this, arguments);
			}
		}

		dataLabelOptions.align = align;
	
	}
function () {
		
		var data = this.data,
			length = data.length,
			i,
			originalDataLabels = [],
			seriesProto = Series.prototype,
			dataLabelOptions = this.options.dataLabels,
			align = dataLabelOptions.align,
			point,
			inverted = this.chart.inverted;
			
		if (dataLabelOptions.enabled || this._hasPointLabels) {
			
			// Step 1: set preliminary values for plotY and dataLabel and draw the upper labels
			i = length;
			while (i--) {
				point = data[i];
				
				// Set preliminary values
				point.y = point.high;
				point._plotY = point.plotY;
				point.plotY = point.plotHigh;
				
				// Store original data labels and set preliminary label objects to be picked up 
				// in the uber method
				originalDataLabels[i] = point.dataLabel;
				point.dataLabel = point.dataLabelUpper;
				
				// Set the default offset
				point.below = false;
				if (inverted) {
					if (!align) {
						dataLabelOptions.align = 'left';
					}
					dataLabelOptions.x = dataLabelOptions.xHigh;								
				} else {
					dataLabelOptions.y = dataLabelOptions.yHigh;
				}
			}
			
			if (seriesProto.drawDataLabels) {
				seriesProto.drawDataLabels.apply(this, arguments); // #1209
			}
			
			// Step 2: reorganize and handle data labels for the lower values
			i = length;
			while (i--) {
				point = data[i];
				
				// Move the generated labels from step 1, and reassign the original data labels
				point.dataLabelUpper = point.dataLabel;
				point.dataLabel = originalDataLabels[i];
				
				// Reset values
				point.y = point.low;
				point.plotY = point._plotY;
				
				// Set the default offset
				point.below = true;
				if (inverted) {
					if (!align) {
						dataLabelOptions.align = 'right';
					}
					dataLabelOptions.x = dataLabelOptions.xLow;
				} else {
					dataLabelOptions.y = dataLabelOptions.yLow;
				}
			}
			if (seriesProto.drawDataLabels) {
				seriesProto.drawDataLabels.apply(this, arguments);
			}
		}

		dataLabelOptions.align = align;
	
	}
function ( ) { var data = this . data , length = data . length , i , originalDataLabels = [ ] , seriesProto = Series . prototype , dataLabelOptions = this . options . dataLabels , align = dataLabelOptions . align , point , inverted = this . chart . inverted ; if ( dataLabelOptions . enabled || this . _hasPointLabels ) { // Step 1: set preliminary values for plotY and dataLabel and draw the upper labels i = length ; while ( i -- ) { point = data [ i ] ; // Set preliminary values point . y = point . high ; point . _plotY = point . plotY ; point . plotY = point . plotHigh ; // Store original data labels and set preliminary label objects to be picked up  // in the uber method originalDataLabels [ i ] = point . dataLabel ; point . dataLabel = point . dataLabelUpper ; // Set the default offset point . below = false ; if ( inverted ) { if ( ! align ) { dataLabelOptions . align = 'left' ; } dataLabelOptions . x = dataLabelOptions . xHigh ; } else { dataLabelOptions . y = dataLabelOptions . yHigh ; } } if ( seriesProto . drawDataLabels ) { seriesProto . drawDataLabels . apply ( this , arguments ) ; // #1209 } // Step 2: reorganize and handle data labels for the lower values i = length ; while ( i -- ) { point = data [ i ] ; // Move the generated labels from step 1, and reassign the original data labels point . dataLabelUpper = point . dataLabel ; point . dataLabel = originalDataLabels [ i ] ; // Reset values point . y = point . low ; point . plotY = point . _plotY ; // Set the default offset point . below = true ; if ( inverted ) { if ( ! align ) { dataLabelOptions . align = 'right' ; } dataLabelOptions . x = dataLabelOptions . xLow ; } else { dataLabelOptions . y = dataLabelOptions . yLow ; } } if ( seriesProto . drawDataLabels ) { seriesProto . drawDataLabels . apply ( this , arguments ) ; } } dataLabelOptions . align = align ; }
Extend the basic drawDataLabels method by running it for both lower and higher
values.
Extend the basic drawDataLabels method by running it for both lower and higher values .