﻿/// <reference name="MicrosoftAjax.debug.js" />
/// <reference name="MicrosoftAjaxTimer.debug.js" />
/// <reference name="MicrosoftAjaxWebForms.debug.js" />

Type.registerNamespace("System.Web.UI.WebControls");

// --------------------------------------------------------------
// HoverTooltip class, derived from Sys.Sys.UI.Control
// --------------------------------------------------------------

System.Web.UI.WebControls.HoverTooltip = function(element) {
    //#region Constructor
    System.Web.UI.WebControls.HoverTooltip.initializeBase(this, [element]);
    this._htmlTemplate = "";
    this._defaultTooltipText = "";
    this._defaultTooltipTitle = "";
    this._controls = [];
    this._targetControls = [];
    this._offsetX = 15;
    this._offsetY = 15;
    
    this._moveDelegate = Function.createDelegate(this, this._move);
    this._cleanupInfo = [];
    //#endregion
}

System.Web.UI.WebControls.HoverTooltip.prototype = {
    //#region Overrides
    initialize: function() {
        System.Web.UI.WebControls.HoverTooltip.callBaseMethod(this, 'initialize');
        
        // attach events to controls collection
        for(var i = 0; i < this._controls.length; i++) {
            this.addControl(this._controls[i]);
        }
        for(var i = 0; i < this._targetControls.length; i++) {
			var c = this._targetControls[i];
			var e = c.ClientID?$get(c.ClientID):null;
			
			if (c.ClientID && c.Elements && e)
			{
				var tags = c.Elements.toLowerCase().split(',');
				for(var j = 0; j<tags.length; j++)
				{
					var tagName = tags[j];
					var d;
					if (c.Recursive)
						d = e.getElementsByTagName(tagName);
					else 
					{
						d = new Array();
						for (var k = 0; k<e.childNodes.length; k++)
						{
							var node = e.childNodes[k];
							if (node.tagName && node.tagName.toLowerCase() == tagName)
							{
								d[d.length] = node;
							}
						}
								
					}
					for (var k = 0; k<d.length; k++)
					{
						this.addControl(d[k]);
					}
				}
			}
			this.addControl(c.ClientID);
        }
        
        // attach mousemove event handler for whole document
        $addHandler(document, "mousemove", this._moveDelegate);

        // show tooltip correctly in ie6
        if (Sys.Browser.agent == Sys.Browser.InternetExplorer && Sys.Browser.version < 7) 
        {
            var htIFrame = document.createElement("iframe");
            htIFrame.id="htIFrame"
            htIFrame.frameBorder = 0;
            htIFrame.src = "javascript:false;";
            htIFrame.style.display = "none";
            htIFrame.style.position = "absolute";
            htIFrame.style.filter = "progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)";
            htIFrame.style.zIndex = div.style.zIndex-1;
            this.get_element().htIFrame = this.get_element().parentNode.insertBefore(htIFrame, this.get_element());
        }
    },
    
    addControl: function(webControl) {
		if (!webControl)
			return;
		if (typeof webControl == "string")
			webControl = $get(webControl);
        if(webControl) {
            var title = webControl.title;
            var tooltipTitle = "";
            if(!title || title.toString() == "") { 
                if(webControl && webControl.attributes && webControl.attributes.getNamedItem("title")) {
                    title = webControl.attributes.getNamedItem("title").value;
                }
            }
            if(webControl && webControl.attributes && webControl.attributes.getNamedItem("tooltiptitle")) {
                tooltipTitle = webControl.attributes.getNamedItem("tooltiptitle").value;
            }
            if(!title || title.toString() == "") 
				title = webControl.savedTitle;

			if ((!title || title=="") && (!tooltipTitle || tooltipTitle == ""))
				return;

            // pass control related values into handler
            var _showDelegate = Function.createDelegate(
                {
                    tooltip:this,
                    webControl:webControl,
                    title:title,
                    tooltipTitle:tooltipTitle
                }, 
                this._show
            );
            if(!title) title = "";
            var _hideDelegate = Function.createDelegate(this, this._hide);
            this._hideDelegate = _hideDelegate;
            $addHandler(webControl, "mouseover", _showDelegate);
            //if (!document.all)
				$addHandler(webControl, "mousemove", _showDelegate);
            $addHandler(webControl, "mouseout", _hideDelegate);
            Array.add(
                this._cleanupInfo, 
                {webControl:webControl,_showDelegate:_showDelegate,_hideDelegate:_hideDelegate}
            );
            webControl.savedTitle = title;
            title = webControl.savedTitle;
            webControl.title = "";
        }
    },

    dispose: function() {
		if (this.get_element().htIFrame)
			delete this.get_element().htIFrame;
        $removeHandler(document, "mousemove", this._moveDelegate);
        for(var i=0; i<this._cleanupInfo.length; i++) {
            var info = this._cleanupInfo[i];
            $removeHandler(info.webControl, "mouseover", info._showDelegate);
            //if (!document.all)
	            $removeHandler(info.webControl, "mousemove", info._showDelegate);
            $removeHandler(info.webControl, "mouseout", info._hideDelegate);
            delete info.webControl;
            delete info._showDelegate;
            delete info._hideDelegate;
        }
        Array.clear(this._cleanupInfo);
        System.Web.UI.WebControls.HoverTooltip.callBaseMethod(this, 'dispose');
    },
    //#endregion
    
    //#region Properties
    get_htmlTemplate: function() {
        return this._htmlTemplate;
    },
    set_htmlTemplate: function(value) {
        if (this._htmlTemplate !== value) {
            this._htmlTemplate = value;
            this.raisePropertyChanged('htmlTemplate');
        }
    },
    get_defaultTooltipText: function() {
        return this._defaultTooltipText;
    },
    set_defaultTooltipText: function(value) {
        if (this._defaultTooltipText !== value) {
            this._defaultTooltipText = value;
            this.raisePropertyChanged('defaultTooltipText');
        }
    },
    get_defaultTooltipTitle: function() {
        return this._defaultTooltipTitle;
    },
    set_defaultTooltipTitle: function(value) {
        if (this._defaultTooltipTitle !== value) {
            this._defaultTooltipTitle = value;
            this.raisePropertyChanged('defaultTooltipTitle');
        }
    },
    get_controls: function() {
        return this._controls;
    },
    set_controls: function(value) {
        if (this._controls !== value) {
            this._controls = value;
            this.raisePropertyChanged('controls');
        }
    },
    get_targetControls: function() {
        return this._targetControls;
    },
    set_targetControls: function(value) {
		if (typeof value == "string");
			value = Sys.Serialization.JavaScriptSerializer.deserialize(value,true);
        if (this._targetControls !== value) {
            this._targetControls = value;
            this.raisePropertyChanged('targetControls');
        }
    },
    get_offsetX: function() {
        return this._offsetX;
    },
    set_offsetX: function(value) {
        if (this._offsetX !== value) {
            this._offsetX = value;
            this.raisePropertyChanged('offsetX');
        }
    },
    get_offsetY: function() {
        return this._offsetY;
    },
    set_offsetY: function(value) {
        if (this._offsetY !== value) {
            this._offsetY = value;
            this.raisePropertyChanged('offsetY');
        }
    },
    //#endregion
    
    //#region Private functions
    _getClientBounds : function() {
        var clientWidth;
        var clientHeight;
        switch(Sys.Browser.agent) {
            case Sys.Browser.InternetExplorer:
                clientWidth = document.documentElement.clientWidth;
                clientHeight = document.documentElement.clientHeight;
                break;
            case Sys.Browser.Safari:
                clientWidth = window.innerWidth;
                clientHeight = window.innerHeight;
                break;
            case Sys.Browser.Opera:
                clientWidth = Math.min(window.innerWidth, document.body.clientWidth);
                clientHeight = Math.min(window.innerHeight, document.body.clientHeight);
                break;
            default:  // Sys.Browser.Firefox, etc.
                clientWidth = Math.min(window.innerWidth, document.documentElement.clientWidth);
                clientHeight = Math.min(window.innerHeight, document.documentElement.clientHeight);
                break;
        }
        var scrollLeft = (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
        var scrollTop = (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
        return new Sys.UI.Bounds(scrollLeft, scrollTop, clientWidth, clientHeight);
    },
    //#endregion
    
    //#region Public functions
    show : function(control, tooltipTitle, tooltipText) {
        var delegate = Function.createDelegate(
            {
                tooltip:this,
                webControl:control,
                title:tooltipText,
                tooltipTitle:tooltipTitle
            }, 
            this._show
        );
        delegate.call();
    },
    hide : function() {
        this._hide();
    },
    //#endregion
    
    //#region Event handlers
    _hide : function(args) {
        this.get_element().style.top = -5000 + "px";
        this.get_element().style.left = -5000 + "px";
        this.get_element().style.visibility = "hidden";
        //this.get_element().innerHTML = "";
        if (this.get_element().htIFrame) {
            this.get_element().htIFrame.style.left = this.get_element().style.left;
            this.get_element().htIFrame.style.top  = this.get_element().style.top;
            this.get_element().htIFrame.style.display = "none";
        }
    },

    _show : function(args) {
        var webControl = this.webControl;
        var tooltip = this.tooltip;
        var tooltipTitle = this.tooltipTitle;
        var title = this.title;
 
        if(!webControl.disabled) {
				
            if (tooltip.get_element().style.visibility != 'visible'
				|| webControl != tooltip.get_element().webControl) {
				if(title.toString() == "") {
					title = tooltip._defaultTooltipText;
				}
				if(tooltipTitle.toString() == "") {
					tooltipTitle = tooltip._defaultTooltipTitle;
				}
				var contents = String.format(
					tooltip._htmlTemplate,
					tooltipTitle,
					title);
				tooltip.get_element().innerHTML = contents;
				tooltip.get_element().webControl = webControl;
				tooltip.get_element().style.visibility = "visible";
			}
        }
    },
    _move : function(args) {
        if(this.get_element() && this.get_element().style.visibility=="visible") {
			var target = args.target ? args.target : args.srcElement;
			if (!target||!target.savedTitle||target.savedTitle=="") {
				this._hide();
				return;
			}
            var bounds = this._getClientBounds();
            var scrollX = bounds.x;
            var scrollY = bounds.y;
            var x = args.clientX+scrollX;
            var y = args.clientY+scrollY;
            var innerWidth = bounds.width;
            var innerHeight = bounds.height;
            if((x + this._offsetX+this.get_element().offsetWidth) >= innerWidth) {
                this.get_element().style.left = (x - 5 - this.get_element().offsetWidth) + "px";
            } else {
                this.get_element().style.left = (x + this._offsetX) + "px";
            }
            
            if(y + this._offsetY + this.get_element().offsetHeight >= innerHeight+scrollY) {
                this.get_element().style.top = (y + 5 - this.get_element().offsetHeight) + "px";
            } else {
                this.get_element().style.top = (y + this._offsetY) + "px";
            }
            
            if (this.get_element().htIFrame != null) {
                    this.get_element().htIFrame.style.left = this.get_element().style.left;
                    this.get_element().htIFrame.style.top  = this.get_element().style.top;
                    this.get_element().htIFrame.style.width  = this.get_element().offsetWidth + "px";
                    this.get_element().htIFrame.style.height = this.get_element().offsetHeight + "px";
                    this.get_element().htIFrame.style.display = "block";
            }
        }
    }
    //#endregion
}

System.Web.UI.WebControls.HoverTooltip.registerClass('System.Web.UI.WebControls.HoverTooltip', Sys.UI.Control);
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();