﻿

//! dw_tooltip_sel.js, dw_tooltip.js with integrated select list overlay 
//! requires: dw_event.js and dw_viewport.js
//! version date: May 21, 2005 moved init call to body onload

//! This code is from Dynamic Web Coding at dyn-web.com
//! Copyright 2003-5 by Sharon Paine 
//! See Terms of Use at www.dyn-web.com/bus/terms.html
//! regarding conditions under which you may use this code.
//! This notice must be retained in the code as is!

function showTooltip(evt, message)
{
	/// <summary>Shows the tooltip.</summary>
	/// <param name="evt" type="Object" optional="false" mayBeNull="false">The associated event.</param>
	/// <param name="message" type="String" optional="false" mayBeNull="false">The message of the tooltip.</param>

	if (typeof (Tooltip) === "undefined" || !Tooltip.ready) return;
	Tooltip.show(evt, message);
}

function hideTooltip()
{
	/// <summary>Hides the current tooltip.</summary>

	if (typeof (Tooltip) === "undefined" || !Tooltip.ready) return;
	Tooltip.hide();
}

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 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 Tooltip =
{
    followMouse		: true,
    overlaySelects	: true,  // iframe shim for select lists (ie win)
    offX			: 8,
    offY			: 12,
    tipID			: "divTooltip",
    showDelay		: 0, 
    hideDelay		: 0,
    ovTimer			: 0,
    ready			: false,
	timer			: null,
	tip				: null,
	shim			: null,
	supportsOverlay	: false,
  
    init : function ()
    {
        if (document.createElement && document.body && typeof document.body.appendChild != "undefined")
        {
            var el = document.createElement("DIV");
            el.id = this.tipID;
            document.body.appendChild(el);
            
            this.supportsOverlay = this.checkOverlaySupport();
            this.ready = true;
        }
    },
    
    show : function (e, msg)
    {
        if (this.timer)
        {
			clearTimeout(this.timer);
			this.timer = 0;
        }
        
        this.tip = document.getElementById(this.tipID);
        
        // set up mousemove
        if (this.followMouse)
            dw_event.add(document, "mousemove", this.trackMouse, true);
            
        // for mac ie
        this.writeTip("");
        this.writeTip(msg);
        
        viewport.getAll();
        this.handleOverlay(1, this.showDelay);
        this.positionTip(e);
        this.timer = setTimeout("Tooltip.toggleVis('" + this.tipID + "', 'visible')", this.showDelay);
    },
    
    writeTip : function (msg)
    {
        if (this.tip && typeof (this.tip.innerHTML) != "undefined")
			this.tip.innerHTML = msg;
    },
    
    positionTip : function (e)
    {
        if (this.tip && this.tip.style)
        {    
            // put e.pageX/Y first! (for Safari)
            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";
        }
            
        this.positionOverlay();
    },
    
    hide : function ()
    {
        if (this.timer)
        {
			clearTimeout(this.timer);
			this.timer = 0;        
        }
        
        this.handleOverlay(0, this.hideDelay);
        this.timer = setTimeout("Tooltip.toggleVis('" + this.tipID + "', 'hidden')", this.hideDelay);
        
        // release mousemove
        if (this.followMouse)
            dw_event.remove(document, "mousemove", this.trackMouse, true);
            
        this.tip = null; 
    },
    
    toggleVis : function (id, vis)
    { 
		// to check for el, prevent (rare) errors
        var el = document.getElementById(id);
        
        if (el)
			el.style.visibility = vis;
    },

    trackMouse : function (e)
    {
    	e = dw_event.DOMit(e);
     	Tooltip.positionTip(e);
    },
    
    checkOverlaySupport : function ()
    {
		// check need for and support of iframe shim
        if (navigator.userAgent.indexOf("Windows") != -1 && 
            typeof (document.body) !== "undefined" && 
            typeof (document.body.insertAdjacentHTML) !== "undefined" && 
            !window.opera && navigator.appVersion.indexOf("MSIE 5.0") == -1) return true;
            
        else
			return false;
    }, 
    
    handleOverlay : function (bVis, d)
    {
        if (this.overlaySelects && this.supportsOverlay)
        {
            if (this.ovTimer)
            {
				clearTimeout(this.ovTimer);
				this.ovTimer = 0;
            }
            
            switch (bVis)
            {
                case 1 :
                {
					if (!document.getElementById('tipShim')) 
						document.body.insertAdjacentHTML("beforeEnd", '<iframe id="tipShim" src="about:blank" style="position:absolute; left:0; top:0; z-index:500; visibility:hidden" scrolling="no" frameborder="0"></iframe>');

					this.shim = document.getElementById('tipShim'); 

					if (this.shim && this.tip)
					{
						this.shim.style.width = this.tip.offsetWidth + "px";
						this.shim.style.height = this.tip.offsetHeight + "px";
					}

					this.ovTimer = setTimeout("Tooltip.toggleVis('tipShim', 'visible')", d);
					break;
				}
                case 0 :
                {
					this.ovTimer = setTimeout("Tooltip.toggleVis('tipShim', 'hidden')", d);

					if (this.shim)
						this.shim = null;
						
					break;
				}
				default : break;
             }
        }
    },    
    
    positionOverlay : function ()
    {
        if (this.overlaySelects && this.supportsOverlay && this.shim)
        {
            this.shim.style.left = this.tip.style.left;
            this.shim.style.top = this.tip.style.top;
        }
    }
};


// Notify ScriptManager that this is the end of the script.
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();


