function Tooltip() {

	var tooltip;
	var tooltipArrow;
	var tooltipContent;
	
	var mouseX;
	var mouseY;
	
	var fadeIn = 100;
	var fadeOut = 100;

	function move(pageX, pageY) {
	
		if (pageX>0 && pageY>0) {
			mouseX = pageX;
			mouseY = pageY;
		}

		var padding = 10;
		var arrowPaddingRight = 20;
		var arrowPaddingLeft = 10;
		var tooltipWidth = tooltip.width();
		var tooltipHeight = tooltip.height();
		var tooltipArrowWidth = tooltipArrow.width();
		
		var x = mouseX - tooltipWidth / 2;
		x = x + 5;
		var dx = 0;
		var y = mouseY - tooltipHeight;
		y = y - 20;
		dx = $(window).width() - (x + tooltipWidth + padding);
		if (dx>0) {
			dx = 0;
		}
		if (x<padding) {
			dx = padding - x;
		}
		x = x + dx;
		
		var ax = tooltipWidth / 2 - dx;
		if (ax>tooltipWidth - tooltipArrowWidth) {
			tooltipArrow.removeClass("left");
			tooltipArrow.addClass("right");		
		} else {
			tooltipArrow.removeClass("right");
			tooltipArrow.addClass("left");
		}
		if (ax>tooltipWidth - tooltipArrowWidth - arrowPaddingRight) {
			ax = tooltipWidth - tooltipArrowWidth - arrowPaddingRight;
		}
		if (ax<arrowPaddingLeft) {
			ax = arrowPaddingLeft;
		}
		tooltipArrow.css({left: ax + "px"});
		if (y<0) {
	//		y = 0;
		}
		tooltip.css({left: x + "px", top: y + "px"});
	}
	
	this.show = function(type, data) {
		var content;
		switch (type) {
		
			case 'help':
				content = $("<div></div>");
				content.empty().append(data);
				break;

			case 'tag':
				content = $("<div></div>");
				content.empty().append($("<p><strong>" + data.text + "</strong></p>"));
				content.append($("<p>Mentions: " + data.count + "</p>"));
				break;
				
			case 'context':
				content = $('<div style="width: 100px"></div>')
					.append("<p><strong>" + data.name + "</strong></p>")			
					.append("<p>" + site.getContextTypeName(data.contextTypeId) + "</p>");
					
//				if (!data.searchResult) {
	
					var loader = $("<center><img src=\"./static/ui_images/loading.gif\" id=\"graphLoader\" width=\"24\" height=\"24\" /></center>");
					content.append(loader);
					
					$.getJSON(AJAX_URL + 'contexts/' + data.id + '/tooltip', null, function(data) {					
						var i;
						
						loader.remove();
					
						content.append("<p>" + data.userCount + " user(s)</p>");
		
						var cold = [];
						var flu  = [];
						
						var now = new Date();
						var nowTime = now.getTime();
						var weekAgoTime = (now.getTime()-(7 * 86400000));
						
						for (i=0; i<data.graph.length; i++) {
							cold.push([data.graph[i].time*1000, parseFloat(data.graph[i].cold)]);
							flu.push([data.graph[i].time*1000, parseFloat(data.graph[i].flu)]);
						}
						
						if (cold.length !== 0 && flu.length !== 0) {							
						
						var graph = $("<div id=\"graphContainer\" style=\"width:100px; height:75px;\"></div>");
						content.append(graph);
	
						$.plot(graph,
									[ 	
										{ xaxis: 2, data: cold, color: "rgb(10,10,230)", shadowSize: 0 },
										{ xaxis: 2, data: flu, color: "rgb(230,10,10)", shadowSize: 0 }
									],
									{ 	
										//xaxis: { ticks: weekdayTicks },
										x2axis: { tickFormatter: function(val, axis) {
																	var d = new Date(val);							
																	var dayNum = d.getDay();
																	var weekdays = [];
																	weekdays[0] = "S";
																	weekdays[1] = "M";
																	weekdays[2] = "T";
																	weekdays[3] = "W";
																	weekdays[4] = "T";
																	weekdays[5] = "F";
																	weekdays[6] = "S";
																	return weekdays[dayNum];
																},
												mode: "time", min: weekAgoTime, minTickSize: [1, "day"], ticks: 7 },
										yaxis: { min:0, max:1, ticks: [[0, "0"], [0.5, "%"], [1, 100]] },
										lines: { lineWidth: 1 }
									}
							);
							
							// create a info for the graph
							var graphInfo = $('<p class="graph-info"><span class="cold">cold</span> / <span class="flu">influenza</span></p>');
							content.append(graphInfo);
							
						}
						
						var tags = "";
						for(i=0; i<data.tagCloud.length; i++){
							tags = tags + data.tagCloud[i].text;
							if (i+1<data.tagCloud.length) tags = tags + ", ";
						}
						if (tags=="") tags = "-";
						content.append("<p class=\"tooltip-block\"><b>Recent illtags:</b> " + tags + " </p>");
						
						move(-1,-1);
					});
//				}
				move(-1,-1);
				
				break;
		}
		tooltipContent.empty().append(content);
		tooltip.show();
	};
	
	this.hide = function() {
		tooltip.hide();
	};

	this.construct = function() {
		tooltip = $("body > div#tooltip");
		tooltipArrow = $("body > div#tooltip div#arrow");
		tooltipContent = $("body > div#tooltip td").eq(4);
		$().bind("mousemove", function(e) {
			move(e.pageX, e.pageY);
		});
	};
}

var tooltip;

$(document).ready(function() {
	tooltip = new Tooltip();
	tooltip.construct();
});

console.log("tooltip.js");