var viewport={
  getWinWidth: function () {
    this.width=0;
    if (window.innerWidth) this.width=window.innerWidth - 18;
    else if (document.documentElement && document.documentElement.clientWidth) 
  		this.width=document.documentElement.clientWidth;
    else if (document.body && document.body.clientWidth) 
  		this.width=document.body.clientWidth;
  },
  getWinHeight: function () {
    this.height=0;
    if (window.innerHeight) this.height=window.innerHeight - 18;
  	else if (document.documentElement && document.documentElement.clientHeight) 
  		this.height=document.documentElement.clientHeight;
  	else if (document.body && document.body.clientHeight) 
  		this.height=document.body.clientHeight;
  },
  getScrollX: function () {
    this.scrollX=0;
  	if (typeof window.pageXOffset == "number") this.scrollX=window.pageXOffset;
  	else if (document.documentElement && document.documentElement.scrollLeft)
  		this.scrollX=document.documentElement.scrollLeft;
  	else if (document.body && document.body.scrollLeft) 
  		this.scrollX=document.body.scrollLeft; 
  	else if (window.scrollX) this.scrollX=window.scrollX;
  },
  getScrollY: function () {
    this.scrollY=0;    
    if (typeof window.pageYOffset == "number") this.scrollY=window.pageYOffset;
    else if (document.documentElement && document.documentElement.scrollTop)
  		this.scrollY=document.documentElement.scrollTop;
  	else if (document.body && document.body.scrollTop) 
  		this.scrollY=document.body.scrollTop; 
  	else if (window.scrollY) this.scrollY=window.scrollY;
  },
  getAll: function () {
    this.getWinWidth(); this.getWinHeight();
    this.getScrollX();  this.getScrollY();
  }
}

var dw_event={
  add: function(obj, etype, fp, cap) {
    cap=cap || false;
    if (obj.addEventListener) obj.addEventListener(etype, fp, cap);
    else if (obj.attachEvent) obj.attachEvent("on" + etype, fp);
  },
  remove: function(obj, etype, fp, cap) {
    cap=cap || false;
    if (obj.removeEventListener) obj.removeEventListener(etype, fp, cap);
    else if (obj.detachEvent) obj.detachEvent("on" + etype, fp);
  },
  DOMit: function(e) { 
    e=e? e: window.event;
    e.tgt=e.srcElement? e.srcElement: e.target;
    if (!e.preventDefault) e.preventDefault=function () { return false; }
    if (!e.stopPropagation) e.stopPropagation=function () { if (window.event) window.event.cancelBubble=true; }
    return e;
  }
}

var Tooltip={
	followMouse: false, offX:8, offY:12, tipID:"tipDiv", showDelay:100, hideDelay:200, ready:false, timer:null, tip:null,
	init: function(){
		if(document.createElement && document.body && typeof document.body.appendChild != "undefined"){
			if(!document.getElementById(this.tipID)){
				var el=document.createElement("DIV");
				el.id=this.tipID;
				document.body.appendChild(el);
			}
			this.ready=true;
		}
	},
	show: function(e,msg,w,h) {
		if(this.timer) { clearTimeout(this.timer);	this.timer=0; }
		this.tip=document.getElementById(this.tipID);
		if(this.followMouse) dw_event.add(document, "mousemove", this.trackMouse, true);
		this.writeTip("",w,h);
		this.writeTip(msg,w,h);
		viewport.getAll();
		this.positionTip(e);
		this.timer=setTimeout("Tooltip.toggleVis('" + this.tipID + "', 'visible')", this.showDelay);
	},
	writeTip: function(msg,w,h) {
		this.tip.style.width=w;
		this.tip.style.height=h;
		msg="<div id='tipInner'>"+msg+"</div><iframe src=\"javascript:false\" id='tipDivIframe' style=\"width:"+w+"px;height:"+h+"px;\"></iframe>";
		if(this.tip && typeof this.tip.innerHTML != "undefined") this.tip.innerHTML=msg;
	},
	positionTip: function(e) {
		if(this.tip && this.tip.style){
			var x=e.pageX? e.pageX: e.clientX + viewport.scrollX;
			var y=e.pageY? e.pageY: e.clientY + viewport.scrollY;
			if(x + this.tip.offsetWidth + this.offX > viewport.width + viewport.scrollX){
				x=x - this.tip.offsetWidth - this.offX;
				if(x < 0) x=0;
			}
			else x=x + this.offX;
			if(y + this.tip.offsetHeight + this.offY > viewport.height + viewport.scrollY){
				y=y - this.tip.offsetHeight - this.offY;
				if ( y < viewport.scrollY ) y=viewport.height + viewport.scrollY - this.tip.offsetHeight;
			}
			else y=y + this.offY;
			this.tip.style.left=x + "px"; this.tip.style.top=y + "px";
		}
	},
	hide: function() {
		if(this.timer) { clearTimeout(this.timer);	this.timer=0; }
		this.timer=setTimeout("Tooltip.toggleVis('" + this.tipID + "', 'hidden')", this.hideDelay);
		if(this.followMouse) dw_event.remove(document, "mousemove", this.trackMouse, true);
		this.tip=null; 
	},
	toggleVis: function(id, vis) {
		var el=document.getElementById(id);
		if(el) el.style.visibility=vis;
	},
	trackMouse: function(e) {
		e=dw_event.DOMit(e);
		Tooltip.positionTip(e);
	}
}
Tooltip.init();

function doTooltip(e,msg,w,h) {
	if(typeof Tooltip == "undefined" || !Tooltip.ready ) return;
	if(!w) w=250;
	if(!h) h=50;
	Tooltip.show(e,msg,w,h);
}

function hideTip() {
	if(typeof Tooltip == "undefined" || !Tooltip.ready ) return;
	Tooltip.hide();
}