docs: function () {
  		// aligning non added elements is expensive
  		if (!this.added) {
  			this.alignOnAdd = true;
  			return;
  		}
  
  		var wrapper = this,
  			elem = wrapper.element,
  			translateX = wrapper.translateX || 0,
  			translateY = wrapper.translateY || 0,
  			x = wrapper.x || 0,
  			y = wrapper.y || 0,
  			align = wrapper.textAlign || 'left',
  			alignCorrection = { left: 0, center: 0.5, right: 1 }[align],
  			nonLeft = align && align !== 'left';
  
  		// apply translate
  		if (translateX || translateY) {
  			wrapper.css({
  				marginLeft: translateX,
  				marginTop: translateY
  			});
  		}
  
  		// apply inversion
  		if (wrapper.inverted) { // wrapper is a group
  			each(elem.childNodes, function (child) {
  				wrapper.renderer.invertChild(child, elem);
  			});
  		}
  
  		if (elem.tagName === 'SPAN') {
  
  			var width, height,
  				rotation = wrapper.rotation,
  				lineHeight,
  				radians = 0,
  				costheta = 1,
  				sintheta = 0,
  				quad,
  				textWidth = pInt(wrapper.textWidth),
  				xCorr = wrapper.xCorr || 0,
  				yCorr = wrapper.yCorr || 0,
  				currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth].join(',');
  
  			if (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed
  
  				if (defined(rotation)) {
  					radians = rotation * deg2rad; // deg to rad
  					costheta = mathCos(radians);
  					sintheta = mathSin(radians);
  
  					// Adjust for alignment and rotation.
  					// Test case: http://highcharts.com/tests/?file=text-rotation
  					css(elem, {
  						filter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta,
  							', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta,
  							', sizingMethod=\'auto expand\')'].join('') : NONE
  					});
  				}
  
  				width = elem.offsetWidth;
  				height = elem.offsetHeight;
  
  				// update textWidth
  				if (width > textWidth) {
  					css(elem, {
  						width: textWidth + PX,
  						display: 'block',
  						whiteSpace: 'normal'
  					});
  					width = textWidth;
  				}
  
  				// correct x and y
  				lineHeight = mathRound((pInt(elem.style.fontSize) || 12) * 1.2);
  				xCorr = costheta < 0 && -width;
  				yCorr = sintheta < 0 && -height;
  
  				// correct for lineHeight and corners spilling out after rotation
  				quad = costheta * sintheta < 0;
  				xCorr += sintheta * lineHeight * (quad ? 1 - alignCorrection : alignCorrection);
  				yCorr -= costheta * lineHeight * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1);
  
  				// correct for the length/height of the text
  				if (nonLeft) {
  					xCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1);
  					if (rotation) {
  						yCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1);
  					}
  					css(elem, {
  						textAlign: align
  					});
  				}
  
  				// record correction
  				wrapper.xCorr = xCorr;
  				wrapper.yCorr = yCorr;
  			}
  
  			// apply position with correction
  			css(elem, {
  				left: x + xCorr,
  				top: y + yCorr
  			});
  
  			// record current text transform
  			wrapper.cTT = currentTextTransform;
  		}
  	}