docs: function () {
  		if (this.options.dataLabels.enabled) {
  			var series = this,
  				x,
  				y,
  				data = series.data,
  				seriesOptions = series.options,
  				options = seriesOptions.dataLabels,
  				str,
  				dataLabelsGroup = series.dataLabelsGroup,
  				chart = series.chart,
  				renderer = chart.renderer,
  				inverted = chart.inverted,
  				seriesType = series.type,
  				color,
  				stacking = seriesOptions.stacking,
  				isBarLike = seriesType === 'column' || seriesType === 'bar',
  				vAlignIsNull = options.verticalAlign === null,
  				yIsNull = options.y === null;
  
  			if (isBarLike) {
  				if (stacking) {
  					// In stacked series the default label placement is inside the bars
  					if (vAlignIsNull) {
  						options = merge(options, {verticalAlign: 'middle'});
  					}
  
  					// If no y delta is specified, try to create a good default
  					if (yIsNull) {
  						options = merge(options, {y: {top: 14, middle: 4, bottom: -6}[options.verticalAlign]});
  					}
  				} else {
  					// In non stacked series the default label placement is on top of the bars
  					if (vAlignIsNull) {
  						options = merge(options, {verticalAlign: 'top'});
  					}
  				}
  			}
  
  			// create a separate group for the data labels to avoid rotation
  			if (!dataLabelsGroup) {
  				dataLabelsGroup = series.dataLabelsGroup =
  					renderer.g('data-labels')
  						.attr({
  							visibility: series.visible ? VISIBLE : HIDDEN,
  							zIndex: 6
  						})
  						.translate(chart.plotLeft, chart.plotTop)
  						.add();
  			} else {
  				dataLabelsGroup.translate(chart.plotLeft, chart.plotTop);
  			}
  
  			// determine the color
  			color = options.color;
  			if (color === 'auto') { // 1.0 backwards compatibility
  				color = null;
  			}
  			options.style.color = pick(color, series.color, 'black');
  
  			// make the labels for each point
  			each(data, function (point) {
  				var barX = point.barX,
  					plotX = (barX && barX + point.barW / 2) || point.plotX || -999,
  					plotY = pick(point.plotY, -999),
  					dataLabel = point.dataLabel,
  					align = options.align,
  					individualYDelta = yIsNull ? (point.y >= 0 ? -6 : 12) : options.y;
  
  				// get the string
  				str = options.formatter.call(point.getLabelConfig());
  				x = (inverted ? chart.plotWidth - plotY : plotX) + options.x;
  				y = (inverted ? chart.plotHeight - plotX : plotY) + individualYDelta;
  
  				// in columns, align the string to the column
  				if (seriesType === 'column') {
  					x += { left: -1, right: 1 }[align] * point.barW / 2 || 0;
  				}
  
  				if (inverted && point.y < 0) {
  					align = 'right';
  					x -= 10;
  				}
  
  				// update existing label
  				if (dataLabel) {
  					// vertically centered
  					if (inverted && !options.y) {
  						y = y + pInt(dataLabel.styles.lineHeight) * 0.9 - dataLabel.getBBox().height / 2;
  					}
  					dataLabel
  						.attr({
  							text: str
  						}).animate({
  							x: x,
  							y: y
  						});
  				// create new label
  				} else if (defined(str)) {
  					dataLabel = point.dataLabel = renderer.text(
  						str,
  						x,
  						y
  					)
  					.attr({
  						align: align,
  						rotation: options.rotation,
  						zIndex: 1
  					})
  					.css(options.style)
  					.add(dataLabelsGroup);
  					// vertically centered
  					if (inverted && !options.y) {
  						dataLabel.attr({
  							y: y + pInt(dataLabel.styles.lineHeight) * 0.9 - dataLabel.getBBox().height / 2
  						});
  					}
  				}
  
  
  				/*if (series.isCartesian) {
  					dataLabel[chart.isInsidePlot(plotX, plotY) ? 'show' : 'hide']();
  				}*/
  
  				if (isBarLike && seriesOptions.stacking && dataLabel) {
  					var barY = point.barY,
  						barW = point.barW,
  						barH = point.barH;
  
  					dataLabel.align(options, null,
  						{
  							x: inverted ? chart.plotWidth - barY - barH : barX,
  							y: inverted ? chart.plotHeight - barX - barW : barY,
  							width: inverted ? barH : barW,
  							height: inverted ? barW : barH
  						});
  				}
  			});
  		}
  	}