﻿/// <reference name="MicrosoftAjax.js"/>

// README
//
// There are two steps to adding a property:
//
// 1. Create a member variable to store your property
// 2. Add the get_ and set_ accessors for your property
//
// Remember that both are case sensitive!


/// <reference name="MicrosoftAjaxTimer.debug.js" />
/// <reference name="MicrosoftAjaxWebForms.debug.js" />
/// <reference name="AjaxControlToolkit.ExtenderBase.BaseScripts.js" assembly="AjaxControlToolkit" />


Type.registerNamespace('Tooltip');

Tooltip.TooltipBehavior = function (element) {
    Tooltip.TooltipBehavior.initializeBase(this, [element]);

    // TODO : (Step 1) Add your property variables here
    this._servicePath = null;
    this._serviceMethod = null;
    this._contextKey = null;
    this._cacheDynamicResults = false;
    this._setUpdatingCssClass = null;
    this._clearDuringUpdate = true;
    this._customScript = null;

    this._callID = 0;
    this._currentCallID = -1;

    this._delay = null;
    this._mouseoverHandler = null;
    this._mouseoutHandler = null;
    this._direction = null;
    this._timer = null;
    this._located = null;
    this._contents = null;
    this._tooltipEl = null;
    this._width = null;

    // Whether or not we've already populated (used for cacheDynamicResults)
    this._populated = false;
}

Tooltip.TooltipBehavior.prototype = {
    initialize: function () {
        Tooltip.TooltipBehavior.callBaseMethod(this, 'initialize');
        $common.prepareHiddenElementForATDeviceUpdate();

        // hook up the trigger if we have one.
        this._mouseoverHandler = Function.createDelegate(this, (this._delay > 0 ? this._onTargetElementDelayedMouseOver : this._onTargetElementMouseOver));
        this._focusHandler = Function.createDelegate(this, (this._delay > 0 ? this._onTargetElementDelayedMouseOver : this._onTargetElementMouseOver));
        this._mouseoutHandler = Function.createDelegate(this, (this._delay > 0 ? this._onTargetElementDelayedMouseOut : this._onTargetElementMouseOut));

        var element = this.get_element();
        if (element) {
            Sys.UI.DomEvent.addHandler(element, "mouseover", this._mouseoverHandler);
            Sys.UI.DomEvent.addHandler(element, "mouseout", this._mouseoutHandler);
            Sys.UI.DomEvent.addHandler(element, "focus", this._mouseoverHandler);
            Sys.UI.DomEvent.addHandler(element, "blur", this._mouseoutHandler);
        }
        var tooltipEl = this.get_TooltipElement();
        if (tooltipEl) {
            // move tooltip to body
            //document.appendChild(tooltipEl);
            $common.setVisible(tooltipEl, false);
            Sys.UI.DomEvent.addHandler(tooltipEl, "mouseover", this._mouseoverHandler);
            Sys.UI.DomEvent.addHandler(tooltipEl, "mouseout", this._mouseoutHandler);
        }


    },
    dispose: function () {
        // TODO: Add your cleanup code here
        // clean up the trigger event.
        var element = this.get_element();
        var tooltipEl = this.get_TooltipElement();
        if (this._mouseoverHandler) {

            if (element) {
                Sys.UI.DomEvent.removeHandler(element, "mouseover", this._mouseoverHandler);
                Sys.UI.DomEvent.removeHandler(element, "focus", this._mouseoverHandler);
            }
            if (tooltipEl) {
                Sys.UI.DomEvent.removeHandler(tooltipEl, "mouseover", this._mouseoverHandler);
            }
            this._mouseoverHandler = null;
        }

        if (this._mouseoutHandler) {
            if (element) {
                Sys.UI.DomEvent.removeHandler(element, "mouseout", this._mouseoutHandler);
                Sys.UI.DomEvent.removeHandler(element, "blur", this._mouseoutHandler);
            }
            if (tooltipEl) {
                Sys.UI.DomEvent.removeHandler(tooltipEl, "mouseout", this._mouseoutHandler);
            }
            this._mouseoutHandler = null;
        }
        if (tooltipEl) {
            try {
                document.body.removeChild(tooltipEl);
            }
            catch (err) {
            }
        }
        Tooltip.TooltipBehavior.callBaseMethod(this, 'dispose');
    },

    populate: function (contextKey) {
        /// <summary>
        /// Get the dymanic content and use it to populate the target element
        /// </summary>
        /// <param name="contextKey" type="String" mayBeNull="true" optional="true">
        /// An arbitrary string value to be passed to the web method. For example, if the element to be
        /// populated is within a data-bound repeater, this could be the ID of the current row.
        /// </param>

        // Don't populate if we already cached the results
        if (this._populated && this._cacheDynamicResults) {
            return;
        }

        // Initialize the population if this is the very first call
        if (this._currentCallID == -1) {
            var eventArgs = new Sys.CancelEventArgs();
            this.raisePopulating(eventArgs);
            if (eventArgs.get_cancel()) {
                return;
            }
            this._setUpdating(true);
        }

        // Either run the custom population script or invoke the web service
        if (this._customScript) {
            // Call custom javascript call to populate control
            var scriptResult = eval(this._customScript);
            this.get_TooltipElement().firstChild.innerHTML = scriptResult;
            this._setUpdating(false);
        }
        else {
            this._currentCallID = ++this._callID;
            if (this._servicePath && this._serviceMethod) {
                Sys.Net.WebServiceProxy.invoke(this._servicePath, this._serviceMethod, false,
                    { contextKey: (contextKey ? contextKey : this._contextKey) },
                    Function.createDelegate(this, this._onMethodComplete), Function.createDelegate(this, this._onMethodError),
                    this._currentCallID);
                $common.updateFormToRefreshATDeviceBuffer();
            }
        }
    },

    _onMethodComplete: function (result, userContext, methodName) {
        /// <summary>
        /// Callback used when the populating service returns successfully
        /// </summary>
        /// <param name="result" type="Object" mayBeNull="">
        /// The data returned from the Web service method call
        /// </param>
        /// <param name="userContext" type="Object">
        /// The context information that was passed when the Web service method was invoked
        /// </param>        
        /// <param name="methodName" type="String">
        /// The Web service method that was invoked
        /// </param>

        // ignore if it's not the current call.
        if (userContext != this._currentCallID) return;

        // Time has passed; make sure the element is still accessible
        var e = this.get_TooltipElement().firstChild;
        if (e) {
            e.innerHTML = result;
        }
        this._setUpdating(false);
        this._rltimer = window.setTimeout(Function.createDelegate(this, this._relocate), 1);
        //this._relocate();
    },

    _onMethodError: function (webServiceError, userContext, methodName) {
        /// <summary>
        /// Callback used when the populating service fails
        /// </summary>
        /// <param name="webServiceError" type="Sys.Net.WebServiceError">
        /// Web service error
        /// </param>
        /// <param name="userContext" type="Object">
        /// The context information that was passed when the Web service method was invoked
        /// </param>        
        /// <param name="methodName" type="String">
        /// The Web service method that was invoked
        /// </param>

        // ignore if it's not the current call.
        if (userContext != this._currentCallID) return;

        var e = this.get_TooltipElement().firstChild;

        if (e) {

            if (webServiceError.get_timedOut()) {
                e.innerHTML = AjaxControlToolkit.Resources.DynamicPopulate_WebServiceTimeout;
            } else {
                e.innerHTML = String.format(AjaxControlToolkit.Resources.DynamicPopulate_WebServiceError, webServiceError.get_statusCode());
            }
        }
        this._relocate();
        this._setUpdating(false);
    },
    _relocate: function () {
        var tooltipEl = this.get_TooltipElement();
        var element = this.get_element();

        var bTooltip = Sys.UI.DomElement.getBounds(tooltipEl);
        var bTarget = Sys.UI.DomElement.getBounds(element);

        var iLeft = 0; var iTop = 0;

        if (this._direction == null) { // top
            iLeft = parseInt((bTarget.x + (bTarget.width / 2)) - (bTooltip.width / 2));
            iTop = bTarget.y - bTooltip.height;
        }
        else if (this._direction == "2") { // right
            iLeft = bTarget.x + bTarget.width;
            iTop = parseInt((bTarget.y + (bTarget.height / 2)) - (bTooltip.height / 2));
        }
        else if (this._direction == "3") { // bottom
            iLeft = parseInt((bTarget.x + (bTarget.width / 2)) - (bTooltip.width / 2));
            iTop = bTarget.y + bTarget.height;
        }
        else if (this._direction == "4") { // left
            iLeft = parseInt(bTarget.x - bTooltip.width);
            iTop = parseInt((bTarget.y + (bTarget.height / 2)) - (bTooltip.height / 2));
        }
        else if (this._direction == "5") { // cursor
        }
        Sys.UI.DomElement.setLocation(tooltipEl, iLeft, iTop);
    },
    _onTargetElementDelayedMouseOver: function (eventElement) {
        if (this._timer) { window.clearTimeout(this._timer); this._timer = null; }
        this._timer = window.setTimeout(Function.createDelegate(this, this._onTargetElementMouseOver), this._delay);
    },
    _onTargetElementMouseOver: function () {
        /// <summary>
        /// Handler for the element described by TargetControlID's mouseover event
        /// </summary>
        // create our control - or get current visible element
        if (this._timer) window.clearTimeout(this._timer);
        var tooltipEl = this.get_TooltipElement();
        if (!$common.getVisible(tooltipEl)) {
            var element = this.get_element();

            var bTooltip = tooltipEl.bounds;
            if (!bTooltip) {
                tooltipEl.bounds = Sys.UI.DomElement.getBounds(tooltipEl);
                bTooltip = tooltipEl.bounds;
            }
            var bTarget = Sys.UI.DomElement.getBounds(element);
            // ** assume bottom for now

            $common.setVisible(tooltipEl, true);
            this._relocate();

            if (this._customScript || (this._servicePath && this._serviceMethod)) {
                // just call through to the trigger.
                this.populate(this._contextKey);
            }
        }
    },
    _onTargetElementDelayedMouseOut: function (eventElement) {
        if (this._timer) { window.clearTimeout(this._timer); this._timer = null; }
        this._timer = window.setTimeout(Function.createDelegate(this, this._onTargetElementMouseOut), this._delay);
    },

    _onTargetElementMouseOut: function (eventElement) {
        if (this._timer) window.clearTimeout(this._timer);
        var tooltipEl = this.get_TooltipElement();
        $common.setVisible(tooltipEl, false);
    },

    _setUpdating: function (updating) {
        /// <summary>
        /// Toggle the display elements to indicate if they are being updated or not
        /// </summary>
        /// <param name="updating" type="Boolean">
        /// Whether or not the display should indicated it is being updated
        /// </param>
        this.setStyle(updating);
        if (!updating) {
            this._currentCallID = -1;
            this._populated = true;
            this.raisePopulated(this, Sys.EventArgs.Empty);
        }
    },

    setStyle: function (updating) {
        /// <summary>
        /// Set the style of the display
        /// </summary>
        /// <param name="updating" type="Boolean">
        /// Whether or not the display is being updated
        /// </param>

        var e = this.get_TooltipElement().firstChild;
        if (this._setUpdatingCssClass) {

            if (!updating) {
                e.className = this._oldCss;
                this._oldCss = null;
            } else {
                this._oldCss = e.className;
                e.className = this._setUpdatingCssClass;
            }
        }
        if (updating && this._clearDuringUpdate) {
            e.innerHTML = "";
        }
    },


    get_ClearContentsDuringUpdate: function () {
        /// <value type="Boolean">
        /// Whether the contents of the target should be cleared when an update begins
        /// </value>
        return this._clearDuringUpdate;
    },
    set_ClearContentsDuringUpdate: function (value) {
        if (this._clearDuringUpdate != value) {
            this._clearDuringUpdate = value;
            this.raisePropertyChanged('ClearContentsDuringUpdate');
        }
    },

    get_ContextKey: function () {
        /// <value type="String">
        /// An arbitrary string value to be passed to the web method.
        /// For example, if the element to be populated is within a
        /// data-bound repeater, this could be the ID of the current row.
        /// </value>
        return this._contextKey;
    },
    set_ContextKey: function (value) {
        if (this._contextKey != value) {
            this._contextKey = value;
            this.raisePropertyChanged('ContextKey');
        }
    },

    get_PopulateTriggerID: function () {
        /// <value type="String" mayBeNull="true" optional="true">
        /// Name of an element that triggers the population of the target when clicked
        /// </value>
        return this._populateTriggerID;
    },
    set_PopulateTriggerID: function (value) {
        if (this._populateTriggerID != value) {
            this._populateTriggerID = value;
            this.raisePropertyChanged('PopulateTriggerID');
        }
    },

    get_TooltipElement: function () {
        // ** ensure tooltip available
        if (this._tooltipEl == null) {
            this._tooltipEl = document.createElement("DIV");
            Sys.UI.DomElement.addCssClass(this._tooltipEl, "tooltip");

            if (this._width != null && this._width > 0) {
                this._tooltipEl.style.width = this._width;
            }

            var tooltipElBorder = document.createElement("DIV");
            Sys.UI.DomElement.addCssClass(tooltipElBorder, "border");
            this._tooltipEl.appendChild(tooltipElBorder);

            if (this._direction == null) { // top
                Sys.UI.DomElement.addCssClass(this._tooltipEl, "ttdirtop");
            }
            else if (this._direction == "2") { // right
                Sys.UI.DomElement.addCssClass(this._tooltipEl, "ttdirright");
            }
            else if (this._direction == "3") { // bottom
                Sys.UI.DomElement.addCssClass(this._tooltipEl, "ttdirbottom");
            }
            else if (this._direction == "4") { // left
                Sys.UI.DomElement.addCssClass(this._tooltipEl, "ttdirleft");
            }

            var tooltipElContents = document.createElement("DIV");
            Sys.UI.DomElement.addCssClass(tooltipElContents, "contents");
            tooltipElBorder.appendChild(tooltipElContents);
            tooltipElContents.innerHTML = this._contents;

            var tooltipElCallout = document.createElement("DIV");
            Sys.UI.DomElement.addCssClass(tooltipElCallout, "callout");
            this._tooltipEl.appendChild(tooltipElCallout);

            document.body.appendChild(this._tooltipEl);
        }
        return this._tooltipEl;
    },

    get_ServicePath: function () {
        /// <value type="String" mayBeNull="true" optional="true">
        /// The URL of the web service to call.  If the ServicePath is not defined, then we will invoke a PageMethod instead of a web service.
        /// </value>
        return this._servicePath;
    },
    set_ServicePath: function (value) {
        if (this._servicePath != value) {
            this._servicePath = value;
            this.raisePropertyChanged('ServicePath');
        }
    },

    get_ServiceMethod: function () {
        /// <value type="String">
        /// The name of the method to call on the page or web service
        /// </value>
        /// <remarks>
        /// The signature of the method must exactly match the following:
        ///    [WebMethod]
        ///    string DynamicPopulateMethod(string contextKey)
        ///    {
        ///        ...
        ///    }
        /// </remarks>
        return this._serviceMethod;
    },
    set_ServiceMethod: function (value) {
        if (this._serviceMethod != value) {
            this._serviceMethod = value;
            this.raisePropertyChanged('ServiceMethod');
        }
    },

    get_cacheDynamicResults: function () {
        /// <value type="Boolean" mayBeNull="false">
        /// Whether the results of the dynamic population should be cached and
        /// not fetched again after the first load
        /// </value>
        return this._cacheDynamicResults;
    },
    set_cacheDynamicResults: function (value) {
        if (this._cacheDynamicResults != value) {
            this._cacheDynamicResults = value;
            this.raisePropertyChanged('cacheDynamicResults');
        }
    },

    get_UpdatingCssClass: function () {
        /// <value type="String">
        /// The CSS class to apply to the target during asynchronous calls
        /// </value>
        return this._setUpdatingCssClass;
    },
    set_UpdatingCssClass: function (value) {
        if (this._setUpdatingCssClass != value) {
            this._setUpdatingCssClass = value;
            this.raisePropertyChanged('UpdatingCssClass');
        }
    },

    get_CustomScript: function () {
        /// <value type="String">
        /// The script to invoke instead of calling a Web or Page method. This script must evaluate to a string value.
        /// </value>
        return this._customScript;
    },
    set_CustomScript: function (value) {
        if (this._customScript != value) {
            this._customScript = value;
            this.raisePropertyChanged('CustomScript');
        }
    },
    get_Contents: function () {
        /// <value type="String">
        /// The script to invoke instead of calling a Web or Page method. This script must evaluate to a string value.
        /// </value>
        return this._contents;
    },
    set_Contents: function (value) {
        if (this._contents != value) {
            this._contents = value;
            this.raisePropertyChanged('Contents');
        }
    },
    get_Delay: function () {
        /// <value type="String">
        /// The script to invoke instead of calling a Web or Page method. This script must evaluate to a string value.
        /// </value>
        return this._delay;
    },
    set_Delay: function (value) {
        if (this._delay != value) {
            this._delay = value;
            this.raisePropertyChanged('Delay');
        }
    },
    get_TooltipWidth: function () {
        /// <value type="String">
        /// The script to invoke instead of calling a Web or Page method. This script must evaluate to a string value.
        /// </value>
        return this._width;
    },
    set_TooltipWidth: function (value) {
        if (this._width != value) {
            this._width = value;
            this.raisePropertyChanged('TooltipWidth');
        }
    },
    get_Direction: function () {
        /// <value type="String">
        /// The script to invoke instead of calling a Web or Page method. This script must evaluate to a string value.
        /// </value>
        return this._direction;
    },
    set_Direction: function (value) {
        if (this._direction != value) {
            this._direction = value;
            this.raisePropertyChanged('Direction');
        }
    },
    add_populating: function (handler) {
        /// <summary>
        /// Add an event handler for the populating event
        /// </summary>
        /// <param name="handler" type="Function" mayBeNull="false">
        /// Event handler
        /// </param>
        /// <returns />
        this.get_events().addHandler('populating', handler);
    },
    remove_populating: function (handler) {
        /// <summary>
        /// Remove an event handler from the populating event
        /// </summary>
        /// <param name="handler" type="Function" mayBeNull="false">
        /// Event handler
        /// </param>
        /// <returns />
        this.get_events().removeHandler('populating', handler);
    },
    raisePopulating: function (eventArgs) {
        /// <summary>
        /// Raise the populating event
        /// </summary>
        /// <param name="eventArgs" type="Sys.CancelEventArgs" mayBeNull="false">
        /// Event arguments for the populating event
        /// </param>
        /// <returns />

        var handler = this.get_events().getHandler('populating');
        if (handler) {
            handler(this, eventArgs);
        }
    },

    add_populated: function (handler) {
        /// <summary>
        /// Add an event handler for the populated event
        /// </summary>
        /// <param name="handler" type="Function" mayBeNull="false">
        /// Event handler
        /// </param>
        /// <returns />
        this.get_events().addHandler('populated', handler);
    },
    remove_populated: function (handler) {
        /// <summary>
        /// Remove an event handler from the populated event
        /// </summary>
        /// <param name="handler" type="Function" mayBeNull="false">
        /// Event handler
        /// </param>
        /// <returns />
        this.get_events().removeHandler('populated', handler);
    },
    raisePopulated: function (eventArgs) {
        /// <summary>
        /// Raise the populated event
        /// </summary>
        /// <param name="eventArgs" type="Sys.EventArgs" mayBeNull="false">
        /// Event arguments for the populated event
        /// </param>
        /// <returns />

        var handler = this.get_events().getHandler('populated');
        if (handler) {
            handler(this, eventArgs);
        }
    }
}
Tooltip.TooltipBehavior.registerClass('Tooltip.TooltipBehavior', Sys.UI.Behavior);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
// SIG // Begin signature block
// SIG // MIIXSgYJKoZIhvcNAQcCoIIXOzCCFzcCAQExCzAJBgUr
// SIG // DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB
// SIG // gjcCAR4wJAIBAQQQEODJBs441BGiowAQS9NQkAIBAAIB
// SIG // AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFPcOdhtkQEAR
// SIG // Ym3z+wvIp3SAYRPWoIISMTCCBGAwggNMoAMCAQICCi6r
// SIG // EdxQ/1ydy8AwCQYFKw4DAh0FADBwMSswKQYDVQQLEyJD
// SIG // b3B5cmlnaHQgKGMpIDE5OTcgTWljcm9zb2Z0IENvcnAu
// SIG // MR4wHAYDVQQLExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
// SIG // ITAfBgNVBAMTGE1pY3Jvc29mdCBSb290IEF1dGhvcml0
// SIG // eTAeFw0wNzA4MjIyMjMxMDJaFw0xMjA4MjUwNzAwMDBa
// SIG // MHkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n
// SIG // dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN
// SIG // aWNyb3NvZnQgQ29ycG9yYXRpb24xIzAhBgNVBAMTGk1p
// SIG // Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBMIIBIjANBgkq
// SIG // hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt3l91l2zRTmo
// SIG // NKwx2vklNUl3wPsfnsdFce/RRujUjMNrTFJi9JkCw03Y
// SIG // SWwvJD5lv84jtwtIt3913UW9qo8OUMUlK/Kg5w0jH9FB
// SIG // JPpimc8ZRaWTSh+ZzbMvIsNKLXxv2RUeO4w5EDndvSn0
// SIG // ZjstATL//idIprVsAYec+7qyY3+C+VyggYSFjrDyuJSj
// SIG // zzimUIUXJ4dO3TD2AD30xvk9gb6G7Ww5py409rQurwp9
// SIG // YpF4ZpyYcw2Gr/LE8yC5TxKNY8ss2TJFGe67SpY7UFMY
// SIG // zmZReaqth8hWPp+CUIhuBbE1wXskvVJmPZlOzCt+M26E
// SIG // RwbRntBKhgJuhgCkwIffUwIDAQABo4H6MIH3MBMGA1Ud
// SIG // JQQMMAoGCCsGAQUFBwMDMIGiBgNVHQEEgZowgZeAEFvQ
// SIG // cO9pcp4jUX4Usk2O/8uhcjBwMSswKQYDVQQLEyJDb3B5
// SIG // cmlnaHQgKGMpIDE5OTcgTWljcm9zb2Z0IENvcnAuMR4w
// SIG // HAYDVQQLExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xITAf
// SIG // BgNVBAMTGE1pY3Jvc29mdCBSb290IEF1dGhvcml0eYIP
// SIG // AMEAizw8iBHRPvZj7N9AMA8GA1UdEwEB/wQFMAMBAf8w
// SIG // HQYDVR0OBBYEFMwdznYAcFuv8drETppRRC6jRGPwMAsG
// SIG // A1UdDwQEAwIBhjAJBgUrDgMCHQUAA4IBAQB7q65+Siby
// SIG // zrxOdKJYJ3QqdbOG/atMlHgATenK6xjcacUOonzzAkPG
// SIG // yofM+FPMwp+9Vm/wY0SpRADulsia1Ry4C58ZDZTX2h6t
// SIG // KX3v7aZzrI/eOY49mGq8OG3SiK8j/d/p1mkJkYi9/uEA
// SIG // uzTz93z5EBIuBesplpNCayhxtziP4AcNyV1ozb2AQWtm
// SIG // qLu3u440yvIDEHx69dLgQt97/uHhrP7239UNs3DWkuNP
// SIG // tjiifC3UPds0C2I3Ap+BaiOJ9lxjj7BauznXYIxVhBoz
// SIG // 9TuYoIIMol+Lsyy3oaXLq9ogtr8wGYUgFA0qvFL0QeBe
// SIG // MOOSKGmHwXDi86erzoBCcnYOMIIEejCCA2KgAwIBAgIK
// SIG // YQHPPgAAAAAADzANBgkqhkiG9w0BAQUFADB5MQswCQYD
// SIG // VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G
// SIG // A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0
// SIG // IENvcnBvcmF0aW9uMSMwIQYDVQQDExpNaWNyb3NvZnQg
// SIG // Q29kZSBTaWduaW5nIFBDQTAeFw0wOTEyMDcyMjQwMjla
// SIG // Fw0xMTAzMDcyMjQwMjlaMIGDMQswCQYDVQQGEwJVUzET
// SIG // MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
// SIG // bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
// SIG // aW9uMQ0wCwYDVQQLEwRNT1BSMR4wHAYDVQQDExVNaWNy
// SIG // b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEB
// SIG // AQUAA4IBDwAwggEKAoIBAQC9MIn7RXKoU2ueiU8AI8C+
// SIG // 1B09sVlAOPNzkYIm5pYSAFPZHIIOPM4du733Qo2X1Pw4
// SIG // GuS5+ePs02EDv6DT1nVNXEap7V7w0uJpWxpz6rMcjQTN
// SIG // KUSgZFkvHphdbserGDmCZcSnvKt1iBnqh5cUJrN/Jnak
// SIG // 1Dg5hOOzJtUY+Svp0skWWlQh8peNh4Yp/vRJLOaL+AQ/
// SIG // fc3NlpKGDXED4tD+DEI1/9e4P92ORQp99tdLrVvwdnId
// SIG // dyN9iTXEHF2yUANLR20Hp1WImAaApoGtVE7Ygdb6v0LA
// SIG // Mb5VDZnVU0kSMOvlpYh8XsR6WhSHCLQ3aaDrMiSMCOv5
// SIG // 1BS64PzN6qQVAgMBAAGjgfgwgfUwEwYDVR0lBAwwCgYI
// SIG // KwYBBQUHAwMwHQYDVR0OBBYEFDh4BXPIGzKbX5KGVa+J
// SIG // usaZsXSOMA4GA1UdDwEB/wQEAwIHgDAfBgNVHSMEGDAW
// SIG // gBTMHc52AHBbr/HaxE6aUUQuo0Rj8DBEBgNVHR8EPTA7
// SIG // MDmgN6A1hjNodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20v
// SIG // cGtpL2NybC9wcm9kdWN0cy9DU1BDQS5jcmwwSAYIKwYB
// SIG // BQUHAQEEPDA6MDgGCCsGAQUFBzAChixodHRwOi8vd3d3
// SIG // Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL0NTUENBLmNy
// SIG // dDANBgkqhkiG9w0BAQUFAAOCAQEAKAODqxMN8f4Rb0J2
// SIG // 2EOruMZC+iRlNK51sHEwjpa2g/py5P7NN+c6cJhRIA66
// SIG // cbTJ9NXkiugocHPV7eHCe+7xVjRagILrENdyA+oSTuzd
// SIG // DYx7RE8MYXX9bpwH3c4rWhgNObBg/dr/BKoCo9j6jqO7
// SIG // vcFqVDsxX+QsbsvxTSoc8h52e4avxofWsSrtrMwOwOSf
// SIG // f+jP6IRyVIIYbirInpW0Gh7Bb5PbYqbBS2utye09kuOy
// SIG // L6t6dzlnagB7gp0DEN5jlUkmQt6VIsGHC9AUo1/cczJy
// SIG // Nh7/yCnFJFJPZkjJHR2pxSY5aVBOp+zCBmwuchvxIdpt
// SIG // JEiAgRVAfJ/MdDhKTzCCBJ0wggOFoAMCAQICEGoLmU/A
// SIG // ACWrEdtFH1h6Z6IwDQYJKoZIhvcNAQEFBQAwcDErMCkG
// SIG // A1UECxMiQ29weXJpZ2h0IChjKSAxOTk3IE1pY3Jvc29m
// SIG // dCBDb3JwLjEeMBwGA1UECxMVTWljcm9zb2Z0IENvcnBv
// SIG // cmF0aW9uMSEwHwYDVQQDExhNaWNyb3NvZnQgUm9vdCBB
// SIG // dXRob3JpdHkwHhcNMDYwOTE2MDEwNDQ3WhcNMTkwOTE1
// SIG // MDcwMDAwWjB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMK
// SIG // V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
// SIG // A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSMwIQYD
// SIG // VQQDExpNaWNyb3NvZnQgVGltZXN0YW1waW5nIFBDQTCC
// SIG // ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANw3
// SIG // bvuvyEJKcRjIzkg+U8D6qxS6LDK7Ek9SyIPtPjPZSTGS
// SIG // KLaRZOAfUIS6wkvRfwX473W+i8eo1a5pcGZ4J2botrfv
// SIG // hbnN7qr9EqQLWSIpL89A2VYEG3a1bWRtSlTb3fHev5+D
// SIG // x4Dff0wCN5T1wJ4IVh5oR83ZwHZcL322JQS0VltqHGP/
// SIG // gHw87tUEJU05d3QHXcJc2IY3LHXJDuoeOQl8dv6dbG56
// SIG // 4Ow+j5eecQ5fKk8YYmAyntKDTisiXGhFi94vhBBQsvm1
// SIG // Go1s7iWbE/jLENeFDvSCdnM2xpV6osxgBuwFsIYzt/iU
// SIG // W4RBhFiFlG6wHyxIzG+cQ+Bq6H8mjmsCAwEAAaOCASgw
// SIG // ggEkMBMGA1UdJQQMMAoGCCsGAQUFBwMIMIGiBgNVHQEE
// SIG // gZowgZeAEFvQcO9pcp4jUX4Usk2O/8uhcjBwMSswKQYD
// SIG // VQQLEyJDb3B5cmlnaHQgKGMpIDE5OTcgTWljcm9zb2Z0
// SIG // IENvcnAuMR4wHAYDVQQLExVNaWNyb3NvZnQgQ29ycG9y
// SIG // YXRpb24xITAfBgNVBAMTGE1pY3Jvc29mdCBSb290IEF1
// SIG // dGhvcml0eYIPAMEAizw8iBHRPvZj7N9AMBAGCSsGAQQB
// SIG // gjcVAQQDAgEAMB0GA1UdDgQWBBRv6E4/l7k0q0uGj7yc
// SIG // 6qw7QUPG0DAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMA
// SIG // QTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAN
// SIG // BgkqhkiG9w0BAQUFAAOCAQEAlE0RMcJ8ULsRjqFhBwEO
// SIG // jHBFje9zVL0/CQUt/7hRU4Uc7TmRt6NWC96Mtjsb0fus
// SIG // p8m3sVEhG28IaX5rA6IiRu1stG18IrhG04TzjQ++B4o2
// SIG // wet+6XBdRZ+S0szO3Y7A4b8qzXzsya4y1Ye5y2PENtEY
// SIG // Ib923juasxtzniGI2LS0ElSM9JzCZUqaKCacYIoPO8cT
// SIG // ZXhIu8+tgzpPsGJY3jDp6Tkd44ny2jmB+RMhjGSAYwYE
// SIG // lvKaAkMve0aIuv8C2WX5St7aA3STswVuDMyd3ChhfEjx
// SIG // F5wRITgCHIesBsWWMrjlQMZTPb2pid7oZjeN9CKWnMyw
// SIG // d1RROtZyRLIj9jCCBKowggOSoAMCAQICCmEFojAAAAAA
// SIG // AAgwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMCVVMx
// SIG // EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
// SIG // ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
// SIG // dGlvbjEjMCEGA1UEAxMaTWljcm9zb2Z0IFRpbWVzdGFt
// SIG // cGluZyBQQ0EwHhcNMDgwNzI1MTkwMTE1WhcNMTMwNzI1
// SIG // MTkxMTE1WjCBszELMAkGA1UEBhMCVVMxEzARBgNVBAgT
// SIG // Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
// SIG // BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjENMAsG
// SIG // A1UECxMETU9QUjEnMCUGA1UECxMebkNpcGhlciBEU0Ug
// SIG // RVNOOjg1RDMtMzA1Qy01QkNGMSUwIwYDVQQDExxNaWNy
// SIG // b3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIIBIjANBgkq
// SIG // hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8AQtspbAGoFn
// SIG // JbEmYrMTS84wusASOPyBZTQHxDayJGj2BwTAB5f0t/F7
// SIG // HmIsRtlLpFE0t9Ns7Vo7tIOhRz0RCC41a0XmwjyMAmYC
// SIG // qRhp60rtJyzuPHdbpNRwmUtXhBDQry34iR3m6im058+e
// SIG // BmKnclTCO8bPP7jhsFgQbOWl18PCdTe99IXhgego2Bvx
// SIG // 8q7xgqPW1wOinxWE+z36q+G2MsigAmTz5v8aJnEIU4oV
// SIG // AvKDJ3ZJgnGn760yeMbXbBZPImWXYk1GL/8jr4XspnC9
// SIG // A8va2DIFxSuQQLae1SyGbLfLEzJ9jcZ+rhcvMvxmux2w
// SIG // RVX4rfotZ4NnKZOE0lqhIwIDAQABo4H4MIH1MB0GA1Ud
// SIG // DgQWBBTol/b374zx5mnjWWhO95iKet2bLjAfBgNVHSME
// SIG // GDAWgBRv6E4/l7k0q0uGj7yc6qw7QUPG0DBEBgNVHR8E
// SIG // PTA7MDmgN6A1hjNodHRwOi8vY3JsLm1pY3Jvc29mdC5j
// SIG // b20vcGtpL2NybC9wcm9kdWN0cy90c3BjYS5jcmwwSAYI
// SIG // KwYBBQUHAQEEPDA6MDgGCCsGAQUFBzAChixodHRwOi8v
// SIG // d3d3Lm1pY3Jvc29mdC5jb20vcGtpL2NlcnRzL3RzcGNh
// SIG // LmNydDATBgNVHSUEDDAKBggrBgEFBQcDCDAOBgNVHQ8B
// SIG // Af8EBAMCBsAwDQYJKoZIhvcNAQEFBQADggEBAA0/d1+R
// SIG // PL6lNaTbBQWEH1by75mmxwiNL7PNP3HVhnx3H93rF7K9
// SIG // fOP5mfIKRUitFLtpLPI+Z2JU8u5/JxGSOezO2YdOiPdg
// SIG // RyN7JxVACJ+/DTEEgtg1tgycANOLqnhhxbWIQZ0+NtxY
// SIG // pCebOtq9Bl0UprIPTMGOPIvyYpn4Zu3V8xwosDLbyjEJ
// SIG // vPsiaEZM+tNzIucpjiIA+1a/Bq6BoBW6NPkojh9KYgWh
// SIG // ifWBR+kNkQjXWDuPHmsJaanASHxVgj9fADhDnAbMP9gv
// SIG // v09zCT39ul70x+w3wmRhoE3UPXDMW7ATgcHUozEavWTW
// SIG // ltJ6PypbRlMJPM0D+T9ZAMyJU2ExggSFMIIEgQIBATCB
// SIG // hzB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
// SIG // Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV
// SIG // TWljcm9zb2Z0IENvcnBvcmF0aW9uMSMwIQYDVQQDExpN
// SIG // aWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQQIKYQHPPgAA
// SIG // AAAADzAJBgUrDgMCGgUAoIGwMBkGCSqGSIb3DQEJAzEM
// SIG // BgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgor
// SIG // BgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBRjJcnmSdh5
// SIG // jFoo50E1TAfRueyPpTBQBgorBgEEAYI3AgEMMUIwQKAm
// SIG // gCQAQwBsAGkAZQBuAHQAQgBlAGgAYQB2AGkAbwByADEA
// SIG // LgBqAHOhFoAUaHR0cDovL21pY3Jvc29mdC5jb20wDQYJ
// SIG // KoZIhvcNAQEBBQAEggEAuHW0NXHobiYvXn3hdnY9539x
// SIG // MoT6sEtAVY9ng57TkoQXaEwOxeNN8do0nl5xxW0jXPnq
// SIG // 0rPCALOojM2T6e0GIkAICq7mAvrH4ky2fmTeiBC2akm9
// SIG // qLlso1obi0LZgazz1HggYzdhZ9/Uc1mWEut8L9dN6FFA
// SIG // KZhHWJ83d7pALaYN8UWzWY6VlNTvdiADlCZ8cFJo3yGq
// SIG // 4/vRiHpWgUMCLVuUr4O5i+Tp/bq9xLBBGINVirTife6y
// SIG // P1PZ9PoSBKD4qfE0KbU+cSGhK1Vl8K7v8qPDurpoR2vm
// SIG // mk3KpZcAr+cqUSM4/S/mV+kWZVXwXnypF7wSmKymdNZA
// SIG // 8XwFvjqr5KGCAh8wggIbBgkqhkiG9w0BCQYxggIMMIIC
// SIG // CAIBATCBhzB5MQswCQYDVQQGEwJVUzETMBEGA1UECBMK
// SIG // V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG
// SIG // A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSMwIQYD
// SIG // VQQDExpNaWNyb3NvZnQgVGltZXN0YW1waW5nIFBDQQIK
// SIG // YQWiMAAAAAAACDAHBgUrDgMCGqBdMBgGCSqGSIb3DQEJ
// SIG // AzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTEw
// SIG // MDMxOTAzNDA1MFowIwYJKoZIhvcNAQkEMRYEFNFTdseC
// SIG // K66zDGmf0ebqH1Giz0W9MA0GCSqGSIb3DQEBBQUABIIB
// SIG // AMdSAf84fde5dAUcgcGSio6dIyBRlOxroO5qM/dbaeQy
// SIG // qSNArHyGHQH/GWbip+zuLzitG90BI+pSFLmH7mCzvOr0
// SIG // +XMf3BkIIuTvNePml2FrTwOhClg+l1q9GGq9+8qamTp5
// SIG // s8P4owcbBSQz3ydBkvW+8h/HFDFz176RxR+22SK8COZy
// SIG // NWxqMzFvv+2JxE6GMCuHTdtEFBhUkohvUDphwcJkL9rD
// SIG // OpHbf4c33u+69mATMN7INiLJ1cHlRC1Ww/k4wNxb2KGl
// SIG // /3UYyvhHjQZCT8/YSVEfHsA0uYs2VCteWcYmNjZWJxU+
// SIG // uQzub+IiNtIpXlp8OiiCinfFsFcavwVsJgQ=
// SIG // End signature block

Type.registerNamespace('Tooltip');Tooltip.Resource={};