/**
 * User: remcokrams
 * Date: 04-01-12
 * Time: 10:37
 */

(function (win) {
    'use strict';

    var defaultProps = {
        extraText : "Klik voor meer info",
        offset : [0,7]
    };

    var ieMode = !!document.all;

    var defaults = function (props, defaultProps) {
        if(!props)
            return defaultProps;

        var f = function () {};
        f.prototype = defaultProps;
        var instance = new f();
        for(var prop in props) if(props.hasOwnProperty(prop)) {
            instance[prop] = props[prop];
        }
        return instance;
    };

    var touchSupport = (function () {
        try {
            var e = document.createEvent("TouchEvent");
            return !!e;
        }
        catch(e) {
            return false;
        }
    })();

    var tooltip = null;

    $.fn.awesomeTooltip = function (props) {
        props = defaults(props, defaultProps);

        if(ieMode) {
            props.offset[1] -= 10;
        }

        if(touchSupport)
            return;

        if(!tooltip) {

            var animateProps = {
                position : "absolute",
                display : "none",
                opacity : 0,
                marginTop : 20,
                zIndex : 99999
            };
            if(ieMode)
                delete animateProps["opacity"];
            tooltip = $("<div class='awesome-tooltip'></div>").css(animateProps);

            $(document.body).append(tooltip);
        }

        $(this).each(function () {
            var tooltipTarget = $(this),
                tooltipWidth, tooltipHeight;

            var mouseX = 0, mouseY = 0, followInterval;

            var recordMouse = function (e) {
                mouseX = e.pageX + props.offset[0];
                mouseY = e.pageY + props.offset[1];
            };

            var animateToMouse = function () {
                tooltip.animate({left : (mouseX - tooltipWidth/2).toString() + "px", top : (mouseY - tooltipHeight).toString() + "px"}, {
                    duration : 300,
                    queue : false
                });
            };

            var first = true;
            tooltipTarget.bind("mouseover", function (e) {
                var animateProps = {
                    marginTop : 0,
                    opacity : 1
                };
                if(ieMode)
                    delete animateProps["opacity"];
                tooltip.addClass("visible").css({display : "block"}).animate(animateProps, 400);

                var tooltipHTML = tooltipTarget.attr("title") + "<span class='extra-text'>" + props.extraText + "</span>";

                tooltip.html(tooltipHTML);

                tooltipWidth = tooltip.outerWidth();
                tooltipHeight = tooltip.outerHeight();

                tooltipTarget.bind("mousemove", recordMouse);
                recordMouse(e);

                clearInterval(followInterval);
                followInterval = setInterval(animateToMouse, 100);

                if(!ieMode || first)
                    tooltip.css({left : (mouseX - tooltipWidth/2).toString() + "px", top : (mouseY - tooltipHeight).toString() + "px"});

                $(document.body).bind("mouseover", hoverOut);

                e.stopPropagation();

                first = false;
            });

            tooltip.bind("mouseover", function (e) {
                e.stopPropagation();
            });

            var hoverOut = function (e) {
                var animateProps = {
                    opacity : 0,
                    marginTop : 20
                };
                if(ieMode)
                    delete animateProps["opacity"];

                tooltip.removeClass("visible").animate(animateProps, {
                    duration : 300,
                    queue : false,
                    complete : function () {
                        tooltip.css({display : "none"});
                    }
                });
                $(document.body).unbind("mouseover", hoverOut);
                clearInterval(followInterval);
            };
        });
    };

})(window);
