(function(window) { 
		
	var vertical_offset = 1; //horizontal offset of tooltip from anchor link
	var horizontal_offset = 4; //horizontal offset of tooltip from anchor link
	var tooltip_padding = 4;
	var tooltip_border = 1;
	var size_offset = (tooltip_padding*2)+(tooltip_border*2);
	
	//window._tooltip = function(text,obj,postype) {
	window._tooltip = function(options) {
		// options
		var text = options.text;
		var postype = options.position;
		if (private.ie6() && postype=='fixed') postype='absolute';
		var topy = options.top ? options.top : null;
		var leftx = options.left ? options.left : null;
		var corner = options.corner ? options.corner : 'top-left';
		if (/top/.test(corner)) var quadrant = options.quadrant ? options.corner : 'top-right';
		if (/bottom/.test(corner)) var quadrant = options.quadrant ? options.corner : 'bottom-right';
		var movetooltip_func = options.movefunc ? options.movefunc : null;
		var obj = options.obj;
		// create static tooltip div
		var static = arguments.callee;
		if (!static.div) {
			// create
			static.div = document.createElement('div');
			static.div.className = 'tooltip';
			static.div.style.position = postype;
			static.div.style.top = '0';
			static.div.style.left = '0';
			static.div.style.width = 'auto';
			static.div.style.height = 'auto';
			static.div.style.zIndex = '6000';
			static.div.style.fontFamily = 'verdana';	
			static.div.style.fontSize = '12px';	
			static.div.style.padding = tooltip_padding+'px';
			static.div.style.border = tooltip_border+'px solid black';
			static.div.style.color = '#333333';
			static.div.style.background = '#ffffdd';
			static.div.style.lineHeight = '18px';
			static.div.style.visibility='hidden';
			// attach			
			document.body.appendChild(static.div);
		} 
		var cleantooltip_func = function() {
			if (static.div) { 
				static.div.style.visibility='hidden'; 
				static.div.style.top = '0';
				static.div.style.left = '0';
				static.div.style.width = 'auto';
				static.div.style.height = 'auto';
				static.div.innerHTML = ''; 
			}
		}
		// attach hide tooltip function
		var hidetooltip_func = function() {
			cleantooltip_func();
			if (obj.removeEventListener) 	{ obj.removeEventListener('mouseout',hidetooltip_func,false); }
			if (obj.removeEventListener) 	{ obj.removeEventListener('click',hidetooltip_func,false); }
			if (obj.detachEvent) 			{ obj.detachEvent('onmouseout',hidetooltip_func); }
			if (obj.detachEvent) 			{ obj.detachEvent('onclick',hidetooltip_func); }
		}
		if (obj.addEventListener) 	{ obj.addEventListener('mouseout',hidetooltip_func,false); }
		if (obj.addEventListener) 	{ obj.addEventListener('click',hidetooltip_func,false); }
		if (obj.attachEvent) 		{ obj.attachEvent('onmouseout',hidetooltip_func); }
		if (obj.attachEvent) 		{ obj.attachEvent('onclick',hidetooltip_func); }
		if (typeof movetooltip_func == 'function') {
			if (obj.addEventListener) 	{ obj.addEventListener('mousemove',movetooltip_func,false); }
			if (obj.attachEvent) 		{ obj.attachEvent('onmousemove',movetooltip_func); }
		}
		if (static.div.innerHTML!=text) {
			// clean toolip from last time just to be sure
			cleantooltip_func();
			// insert tooltip text - must happen after obj position calculate for IE to behave
			static.div.innerHTML = text; 
		}
		// get with and height of the div
		var widthx = static.div.offsetWidth;
		var heighty = static.div.offsetHeight;
		if (/right/.test(corner)) leftx += obj.offsetWidth;
		if (/bottom/.test(corner)) topy += obj.offsetHeight;
		// position tooltip div - must happen after tooltip text is inserted
		static.div.style.position = postype;
		static.div.style.width = (widthx-size_offset+1)+"px";  // +1 needed for FF 3.5
		static.div.style.height = (heighty-size_offset)+"px";
		//if (/right/.test(quadrant)) static.div.style.left = (leftx-horizontal_offset)+"px";
		//if (/left/.test(quadrant)) static.div.style.left = (leftx-widthx-horizontal_offset)+"px";
		//if (/top/.test(quadrant)) static.div.style.top = (topy-vertical_offset-heighty)+"px";
		//if (/bottom/.test(quadrant)) static.div.style.top = (topy+heighty-vertical_offset-heighty)+"px";
		
		if (/right/.test(quadrant)) static.div.style.left = (leftx+horizontal_offset)+"px";
		if (/left/.test(quadrant)) static.div.style.left = (leftx-widthx-horizontal_offset)+"px";
		if (/top/.test(quadrant)) static.div.style.top = (topy-vertical_offset-heighty)+"px";
		if (/bottom/.test(quadrant)) static.div.style.top = (topy+vertical_offset)+"px";
		
		static.div.x = leftx; 
		static.div.y = topy; 
		// show tooltip div
		static.div.style.visibility='visible';
	}

	window.fixedtooltip = function(tiptext,obj,options) {
		// position variables
		var topy = 0;
		var leftx = 0;
		var offsetobj = obj; 
		// calculate obj position information
		while ( offsetobj!=null && !(private.safari() && offsetobj==document.body)) {	
			topy += offsetobj.offsetTop; 
			leftx += offsetobj.offsetLeft; 
			offsetobj = offsetobj.offsetParent; 	
		}
		// call tooltip
		window._tooltip(private.merge({
			text:tiptext,
			top:topy,
			left:leftx,
			obj:obj,
			position:'fixed'
		},options));
	}
	window.absolutetooltip = function(tiptext,obj,options) {
		// position variables
		var topy = 0;
		var leftx = 0;
		var offsetobj = obj; 
		// calculate obj position information
		while ( offsetobj!=null && !(private.safari() && offsetobj==document.body)) {	
			topy += offsetobj.offsetTop; 
			leftx += offsetobj.offsetLeft; 
			offsetobj = offsetobj.offsetParent; 	
		}
		// call tooltip
		window._tooltip(private.merge({
			text:tiptext,
			top:topy,
			left:leftx,
			obj:obj,
			position:'absolute'
		},options));
	}
	window.divtooltip = function(div,obj,options) {
		// get div content
		if (typeof div=='string') { div = document.getElementById(div); }
		var tiptext = div.innerHTML;
		// position variables
		var topy = 0;
		var leftx = 0;
		var offsetobj = obj; 
		// calculate obj position information
		while ( offsetobj!=null && !(private.safari() && offsetobj==document.body)) {	
			topy += offsetobj.offsetTop; 
			leftx += offsetobj.offsetLeft; 
			offsetobj = offsetobj.offsetParent; 	
		}
		// call tooltip
		window._tooltip(private.merge({
			text:tiptext,
			top:topy,
			left:leftx,
			obj:obj,
			position:'absolute'
		},options));
	}
	window.mousetooltip = function(tiptext,ev,options) {
		var ie6 = private.ie6();
		var showmousetip = function(ev) {
			var objevent = window.event ? window.event : ev;
			var obj = objevent.target ? objevent.target : objevent.srcElement;
			var ie = !ev.pageX;
			if (!ie) {
				var mousex = ev.pageX - Math.max(document.body.scrollLeft,document.documentElement.scrollLeft);
				var mousey = ev.pageY - Math.max(document.body.scrollTop,document.documentElement.scrollTop);
			}
			if (ie && !ie6) {
				var mousex = ev.clientX + document.body.scrollLeft - document.body.clientLeft;
				var mousey = (ev.clientY + document.body.scrollTop - document.body.clientTop) 
			}
			if (ie && ie6) {
				var mousex = ev.clientX - document.body.clientLeft;
				var mousey = (ev.clientY - document.body.clientTop) 
			}
			window._tooltip(private.merge({
				text:tiptext,
				top:mousey,
				left:mousex,
				obj:obj,
				position:'fixed',
				corner:'top-left',
				quadrant:'top-right'
				//,movefunc: showmousetip // goes really slow in IE
			},options));
		}
		showmousetip(ev);
	}
	var private = {}
	private.safari = function() {
		// http://www.useragentstring.com/pages/Safari/
		var gecko = /Gecko/.test(navigator.userAgent);
		var safari = /Safari/.test(navigator.userAgent);
		var applewebkit = /AppleWebKit/.test(navigator.userAgent);
		return gecko && safari && applewebkit;
	}
	private.ie6 = function() {
		// http://www.useragentstring.com/pages/Internet%20Explorer/
		var msie = /MSIE/.test(navigator.userAgent);
		var msie6 = /MSIE 6/.test(navigator.userAgent);
		var msie8 = /MSIE 8/.test(navigator.userAgent);
		var opera = /Opera/.test(navigator.userAgent);
		return msie && msie6 && !msie8 && !opera;
	}
	private.merge = function(obj1,obj2) {
		var merged = {};
		for(var index in obj1) {
			merged[index] = obj1[index];
		}
		for(var index in obj2) {
			merged[index] = obj2[index];
		}
		return merged;
	}

})(window);