﻿/// <reference name="MicrosoftAjax.debug.js" />
/// <reference name="MicrosoftAjaxTimer.debug.js" />
/// <reference name="MicrosoftAjaxWebForms.debug.js" />

Type.registerNamespace("Devarchive.Net");

// --------------------------------------------------------------
// HoverTooltip class, derived from Sys.Sys.UI.Control
// --------------------------------------------------------------

Devarchive.Net.HoverTooltip = function(element) {
    //#region Constructor
    Devarchive.Net.HoverTooltip.initializeBase(this, [element]);

    this._htmlTemplate = "";
    this._defaultTooltipText = "";
    this._defaultTooltipTitle = "";
    this._controls = [];
    this._offsetX = 15;
    this._offsetY = 15;
    
    this._moveDelegate = Function.createDelegate(this, this._move);
    this._cleanupInfo = [];
    //#endregion
}

Devarchive.Net.HoverTooltip.prototype = {
    //#region Overrides
    initialize: function() {
        Devarchive.Net.HoverTooltip.callBaseMethod(this, 'initialize');
        // attach events to controls collection
        for (var i = 0; i < this._controls.length; i++) {
            var webControl = $get(this._controls[i]);
            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;
                }
                // 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);
                $addHandler(webControl, "mouseover", _showDelegate);
                $addHandler(webControl, "mouseout", _hideDelegate);
                Array.add(
                    this._cleanupInfo,
                    { webControl: webControl, _showDelegate: _showDelegate, _hideDelegate: _hideDelegate }
                );
                webControl.title = "";
            }
        }
        // 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;
            htIFrame.style.zIndex = 999;
            this.get_element().htIFrame = this.get_element().parentNode.insertBefore(htIFrame, this.get_element());
        }
    },

    dispose: function() {
        //delete this.get_element().htIFrame;
        if (this.get_element().htIFrame != null) {
            //delete this.get_element().htIFrame;
            this.get_element().htIFrame = null;
        }

        $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);
            $removeHandler(info.webControl, "mouseout", info._hideDelegate);
            delete info.webControl;
            delete info._showDelegate;
            delete info._hideDelegate;
        }
        Array.clear(this._cleanupInfo);
        Devarchive.Net.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_offsetX: function() {
        return this._offsetX;
    },
    set_offsetX: function(value) {
        //alert("screen.width=" + screen.width + " offsetX=" + value);
        //Could not get the Div and fly window position properly for different client resolution
        //So this is bad way to work around it. Phu
        switch (screen.width) {
            case 800:
                value = value + 130;
                break;
            case 1024:
                value = value + 130;
                break;
            case 1152:
                value = value + 65;
                break;
            case 1280:
                break;
            default:
                break;
        }

        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;
                clientWidth = screen.width;
                clientHeight = screen.height;
                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;

            //alert("clientWidth=" + clientWidth);      

        }
        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
    _show: function(args) {
        var webControl = this.webControl;
        var tooltip = this.tooltip;
        var tooltipTitle = this.tooltipTitle;
        var title = this.title;

        if (!webControl.disabled) {
            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().style.visibility = "visible";
        }
    },
    _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";
        }
    },
    _move: function(args) {
        if (this.get_element() && this.get_element().style.visibility == "visible") {
            var bounds = this._getClientBounds();
            var scrollX = bounds.x;
            var scrollY = bounds.y;
            var x = args.clientX + scrollX;
            var y = args.clientY + scrollY;
            //alert("bounds.width=" + bounds.width);
            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
}

Devarchive.Net.HoverTooltip.registerClass('Devarchive.Net.HoverTooltip', Sys.UI.Control);
Type.registerNamespace('Devarchive.Net');Devarchive.Net.Resource={};
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();