﻿/// <reference name="MicrosoftAjax.js"/>

Type.registerNamespace("Enigma");

Enigma.ToolTip = function() {
    Enigma.ToolTip.initializeBase(this);
    this._displayAfter = 500;
    this._onMouseMoveHandler = null;
    this._onMouseOutHandler = null;
    this._onMouseOverHandler = null;
    this._elements = [];
    this._popupElement = null;
    this._popupElementClass = null;
    this._showPopupHandler = null;
    this._timeoutID = null;
}

Enigma.ToolTip.prototype = {
    dispose: function() {
        for (var i = 0, element; element = this._elements[i]; i++) {
            this._removeHandlers(element);
        }
        Enigma.ToolTip.callBaseMethod(this, 'dispose');
    },
    initialize: function() {
        Enigma.ToolTip.callBaseMethod(this, 'initialize');
        var popupElement = this._createPopupElement();
        document.body.appendChild(popupElement);
        this._popupElement = popupElement;
        this._showPopupHandler = Function.createDelegate(this, this._showPopup);
        this._onMouseMoveHandler = Function.createDelegate(this, this._onMouseMove);
        this._onMouseOutHandler = Function.createDelegate(this, this._onMouseOut);
        this._onMouseOverHandler = Function.createDelegate(this, this._onMouseOver);
    },
    _addHandlers: function(element) {
        $addHandler(element, "mouseover", this._onMouseOverHandler);
        $addHandler(element, "mousemove", this._onMouseMoveHandler);
        $addHandler(element, "mouseout", this._onMouseOutHandler);
    },
    _clearTimeout: function() {
        var timeoutID = this._timeoutID;
        if (timeoutID) {
            clearTimeout(timeoutID);
            this._timeoutID = null;
        }
    },
    _createPopupElement: function() {
        var element = document.createElement("div"), style = element.style;
        style.position = "absolute";
        style.display = "none";
        element.className = this._popupElementClass;
        return element;
    },
    _getViewportLocation: function() {
        var w = window, de = document.documentElement, body = document.body;
        var x = w.pageXOffset || de.scrollLeft || body.scrollLeft;
        var y = w.pageYOffset || de.scrollTop || body.scrollTop;
        return { x: x, y: y };
    },
    _hidePopup: function() {
        this._clearTimeout();
        this._popupElement.style.display = "none";
    },
    _onMouseMove: function(e) {
        var viewport = this._getViewportLocation();
        this._setPopupLocation(viewport.x + e.clientX, viewport.y + e.clientY);
    },
    _onMouseOut: function(e) {
        this._hidePopup();
    },
    _onMouseOver: function(e) {
        var caption = e.target._toolTip;
        this._popupElement.innerHTML = caption;
        this._timeoutID = setTimeout(this._showPopupHandler, this._displayAfter);
    },
    _removeHandlers: function(element) {
        $removeHandler(element, "mouseover", this._onMouseOverHandler);
        $removeHandler(element, "mousemove", this._onMouseMoveHandler);
        $removeHandler(element, "mouseout", this._onMouseOutHandler);
    },
    _showPopup: function() {
        this._popupElement.style.display = "";
        this._timeoutID = null;
    },
    _setPopupLocation: function(x, y) {
        var style = this._popupElement.style;
        style.left = x + "px";
        style.top = (y + 20) + "px";
    },
    setToolTip: function(element, caption) {
        element._toolTip = caption;
        this._addHandlers(element);
    },
    get_popupElementClass: function() {
        return this._popupElementClass;
    },
    set_popupElementClass: function(value) {
        this._popupElementClass = value;
    }
}
Enigma.ToolTip.registerClass('Enigma.ToolTip', Sys.Component);

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
