/*global jQuery */
(function($) {
    $.fn.messageTooltip = function (params) {

        params = $.extend({
            position: "right", // top, bottom, left, right
            message: "",
            effect: "show", // show, hide, fadein, fadeout, blink
            offset: 25,
            width: 300,
            y_offset: 0
        }, params);

        return this.each(function() {
            var $_this = $(this);
            var $_tooltip = $('<div class="tooltip"><div class="pointer"></div><div class="txt"></div></div>').css({ display: "none" });
            $_tooltip.insertAfter($_this);

            // -----------------------------------------------------------------
            //        Public API
            // -----------------------------------------------------------------
            this.tooltipEffect = function (effect) {
                switch (effect) {
                    case 'hide':
                        $_tooltip.hide();
                        break;
                    case 'fadein':
                        $_tooltip.fadeIn();
                        break;
                    case 'fadeout':
                        $_tooltip.fadeOut();
                        break;
                    case 'blink':
                         $_tooltip.fadeIn("slow", function () {
                             setTimeout(function () {
                                 $_tooltip.fadeOut("slow");
                             }, 5000);
                         });
                        break;
                    default:
                        $_tooltip.show();
                }
            };

            this.tooltipSetMessage = function (message) {
                $_tooltip.removeClass("loading");
                $(".txt", $_tooltip).html(message);
            };

            this.tooltipSetPosition = function (position) {
                var cnt_pos = {};
                try {
                    cnt_pos = $_this.position();
                } catch (err) {
                    console.error("Cannot get element position! " + err);
                    return;
                }

                switch (position) {
                    case 'top':
                        $_tooltip.css({
                            height: "auto",
                            width: $_this.outerWidth() + 'px',
                            top: cnt_pos.top - $_tooltip.outerHeight() - params.offset + 'px',
                            left: cnt_pos.left + 'px'
                        }).removeClass("left right bottom").addClass("top");
                        break;
                    case 'left':
                        $_tooltip.css({
                            height: "auto",
                            width: params.width + 'px',
                            top: cnt_pos.top + 'px',
                            left: cnt_pos.left - params.width - params.offset + 'px'
                        }).removeClass("top right bottom").addClass("left");
                        break;
                    case 'bottom':
                        $_tooltip.css({
                            height: "auto",
                            width: $_this.outerWidth() + 'px',
                            top: cnt_pos.top + $_this.outerHeight() + params.offset + 'px',
                            left: cnt_pos.left + 'px'
                        }).removeClass("left top right").addClass("bottom");
                        break;
                    default:
                        $_tooltip.css({
                            height: "auto",
                            width: params.width + 'px',
                            top: cnt_pos.top + params.y_offset + 'px',
                            left: cnt_pos.left + $_this.outerWidth() + params.offset + 'px'
                        }).removeClass("top bottom left").addClass("right");
                }
            };

            this.tooltipLoading = function () {
                $_tooltip.addClass("loading");
                $(".txt", $_tooltip).empty();
            };
            // -----------------------------------------------------------------
            //        Init
            // -----------------------------------------------------------------
            $_this[0].tooltipSetMessage(params.message);
            $_this[0].tooltipSetPosition(params.position);
            $_this[0].tooltipEffect(params.effect);
        });
    };
})(jQuery);
