docs: function getOffset() {
  
  			var hasData = associatedSeries.length && defined(min) && defined(max),
  				titleOffset = 0,
  				titleMargin = 0,
  				axisTitleOptions = options.title,
  				labelOptions = options.labels,
  				directionFactor = [-1, 1, 1, -1][side],
  				n;
  
  			if (!axisGroup) {
  				axisGroup = renderer.g('axis')
  					.attr({ zIndex: 7 })
  					.add();
  				gridGroup = renderer.g('grid')
  					.attr({ zIndex: 1 })
  					.add();
  			}
  
  			labelOffset = 0; // reset
  
  			if (hasData || isLinked) {
  			    
  			    // PATCH by Simon Fishel
                  //
                  // call the tickLabelsRenderStart hook before initialize the ticks
                  //
                  // + if(hooks.tickLabelsRenderStart) {
                  // +    hooks.tickLabelsRenderStart(options, categories, chart);
                  // + }
                  
                  if(hooks.tickLabelsRenderStart) {
                      hooks.tickLabelsRenderStart(options, categories, chart);
                  }
  			    
  				each(tickPositions, function (pos) {
  					if (!ticks[pos]) {
  						ticks[pos] = new Tick(pos);
  					} else {
  						ticks[pos].addLabel(); // update labels depending on tick interval
  					}
  
  					// left side must be align: right and right side must have align: left for labels
  					if (side === 0 || side === 2 || { 1: 'left', 3: 'right' }[side] === labelOptions.align) {
  
  						// get the highest offset
  						labelOffset = mathMax(
  							ticks[pos].getLabelSize(),
  							labelOffset
  						);
  					}
  
  				});
  
  				if (staggerLines) {
  					labelOffset += (staggerLines - 1) * 16;
  				}
  
  			} else { // doesn't have data
  				for (n in ticks) {
  					ticks[n].destroy();
  					delete ticks[n];
  				}
  			}
  
  			if (axisTitleOptions && axisTitleOptions.text) {
  				if (!axisTitle) {
  					axisTitle = axis.axisTitle = renderer.text(
  						axisTitleOptions.text,
  						0,
  						0,
  						axisTitleOptions.useHTML
  					)
  					.attr({
  						zIndex: 7,
  						rotation: axisTitleOptions.rotation || 0,
  						align:
  							axisTitleOptions.textAlign ||
  							{ low: 'left', middle: 'center', high: 'right' }[axisTitleOptions.align]
  					})
  					.css(axisTitleOptions.style)
  					.add();
  					axisTitle.isNew = true;
  				}
  
  				titleOffset = axisTitle.getBBox()[horiz ? 'height' : 'width'];
  				titleMargin = pick(axisTitleOptions.margin, horiz ? 5 : 10);
  
  			}
  
  			// handle automatic or user set offset
  			offset = directionFactor * (options.offset || axisOffset[side]);
  
  			axisTitleMargin =
  				labelOffset +
  				(side !== 2 && labelOffset && directionFactor * options.labels[horiz ? 'y' : 'x']) +
  				titleMargin;
  
  			axisOffset[side] = mathMax(
  				axisOffset[side],
  				axisTitleMargin + titleOffset + directionFactor * offset
  			);
  
  		}