docs: function refresh(point) {
  			var x,
  				y,
  				show,
  				bBox,
  				plotX,
  				plotY = 0,
  				textConfig = {},
  				text,
  				pointConfig = [],
  				tooltipPos = point.tooltipPos,
  				formatter = options.formatter || defaultFormatter,
  				hoverPoints = chart.hoverPoints,
  				placedTooltipPoint;
  
  			// shared tooltip, array is sent over
  			if (shared) {
  
  				// hide previous hoverPoints and set new
  				if (hoverPoints) {
  					each(hoverPoints, function (point) {
  						point.setState();
  					});
  				}
  				chart.hoverPoints = point;
  
  				each(point, function (item) {
  					/*var series = item.series,
  						hoverPoint = series.hoverPoint;
  					if (hoverPoint) {
  						hoverPoint.setState();
  					}
  					series.hoverPoint = item;*/
  					item.setState(HOVER_STATE);
  					plotY += item.plotY; // for average
  
  					pointConfig.push(item.getLabelConfig());
  				});
  
  				plotX = point[0].plotX;
  				plotY = mathRound(plotY) / point.length; // mathRound because Opera 10 has problems here
  
  				textConfig = {
  					x: point[0].category
  				};
  				textConfig.points = pointConfig;
  				point = point[0];
  
  			// single point tooltip
  			} else {
  				textConfig = point.getLabelConfig();
  			}
  			text = formatter.call(textConfig);
  
  			// register the current series
  			currentSeries = point.series;
  
  			// get the reference point coordinates (pie charts use tooltipPos)
  			plotX = shared ? plotX : point.plotX;
  			plotY = shared ? plotY : point.plotY;
  			
  			// PATCH here by Simon Fishel
              //
              // + if(point.series.chart.options.chart.type in {column: true, bar: true}) {
              // +     plotY = Math.max(plotY, 0);
              // + }
              //
              // adjust the y position so the tooltip will show up even if the value is off the chart
              // for column/bar charts
              
              if(point.series.chart.options.chart.type in {column: true, bar: true}) {
                  plotY = Math.max(plotY, 0);
              }
              
              // PATCH here by Simon Fishel
              //
              // + if(point.series.chart.options.chart.type === 'column') {
              // +     plotX = point.barX;
              // + }
              //
              // adjustment to the tooltip horizontal position for column charts
              
              if(point.series.chart.options.chart.type === 'column') {
                  plotX = point.barX;
              }
  			
  			x = mathRound(tooltipPos ? tooltipPos[0] : (inverted ? plotWidth - plotY : plotX));
  			y = mathRound(tooltipPos ? tooltipPos[1] : (inverted ? plotHeight - plotX : plotY));
  
  
  			// hide tooltip if the point falls outside the plot
  			show = shared || !point.series.isCartesian || isInsidePlot(x, y);
  
  			// update the inner HTML
  			if (text === false || !show) {
  				hide();
  			} else {
  
  				// show it
  				if (tooltipIsHidden) {
  					group.show();
  					tooltipIsHidden = false;
  				}
  
  				// update text
  				label.attr({
  					text: text
  				});
  
  				// get the bounding box
  				bBox = label.getBBox();
  				boxWidth = bBox.width + 2 * padding;
  				boxHeight = bBox.height + 2 * padding;
  
  				// set the size of the box
  				box.attr({
  					width: boxWidth,
  					height: boxHeight,
  					stroke: options.borderColor || point.color || currentSeries.color || '#606060'
  				});
  
  				placedTooltipPoint = placeBox(boxWidth, boxHeight, plotLeft, plotTop, plotWidth, plotHeight, {x: x, y: y});
  
  				// do the move
  				move(mathRound(placedTooltipPoint.x - boxOffLeft), mathRound(placedTooltipPoint.y - boxOffLeft));
  			}
  
  
  			// crosshairs
  			if (crosshairsOptions) {
  				crosshairsOptions = splat(crosshairsOptions); // [x, y]
  
  				var path,
  					i = crosshairsOptions.length,
  					attribs,
  					axis;
  
  				while (i--) {
  					axis = point.series[i ? 'yAxis' : 'xAxis'];
  					if (crosshairsOptions[i] && axis) {
  						path = axis
  							.getPlotLinePath(point[i ? 'y' : 'x'], 1);
  						if (crosshairs[i]) {
  							crosshairs[i].attr({ d: path, visibility: VISIBLE });
  
  						} else {
  							attribs = {
  								'stroke-width': crosshairsOptions[i].width || 1,
  								stroke: crosshairsOptions[i].color || '#C0C0C0',
  								zIndex: 2
  							};
  							if (crosshairsOptions[i].dashStyle) {
  								attribs.dashstyle = crosshairsOptions[i].dashStyle;
  							}
  							crosshairs[i] = renderer.path(path)
  								.attr(attribs)
  								.add();
  						}
  					}
  				}
  			}
  		}