/**
 * Funkcja tworząca obiekt mousetip
 * @param {Object} local_conf obiekt konfiguracji
 */
Mousetip = function (local_conf) {
    if (typeof jQuery == 'undefined') {
         throw 'Mousetip exception: jQuery not found.';
    }

    jQuery.noConflict();

    // inicjalizacja obiektu konfiguracji
    var conf = {};

    conf.mousetipEnabled = true;
    conf.mousetipOffset  = [10, -10];
    conf.mousetipClass   = 'mousetip';

    // wypełnienie obiektu konfiguracji
    for (var field in local_conf) {
        if(field && local_conf[field]) {
            conf[field] = local_conf[field];
        }
    }
    
    // inicjalizacja zmiennych i funkcji lokalnych
    var mousetipJQ = jQuery([]);
    var mousetipTimeout = null;

    /**
     * Funkcja inicjująca działanie mechanizmu.
     */
    var init = function () {
        if (conf.mousetipEnabled) {
            jQuery('body').append(
                mousetipJQ = jQuery('<div>').attr('class', conf.mousetipClass).attr('style', 'display: none; position: absolute; '));

            jQuery('body').mousemove(
                function (e) {
                    mousetipJQ.css('left', (e.pageX || e.clientX) + conf.mousetipOffset[0])
                               .css('top', (e.pageY || e.clientY) + conf.mousetipOffset[1]);
                });
        }

        //
        init = function () {};
    };

    /**
     * 
     * @param {Object} text
     */
    var show = function (content) {
        if (!conf.mousetipEnabled || !content) {
            return;
        }

        mousetipJQ.html(content);

        if (mousetipTimeout != null) {
            clearTimeout(mousetipTimeout);
            mousetipTimeout = null
        }
        else {
            mousetipJQ.fadeIn(100);
        }
    }

    /**
     * 
     * @param {Object} delay
     */
    var hide = function (delay) {
        if (!delay) {
            delay = 0;
        }
        
        if(mousetipTimeout == null) {
            mousetipTimeout = setTimeout(
                function () {
                    mousetipJQ.fadeOut(100);
                    mousetipTimeout = null;
                },
                delay);
        }
    }

    /**
     * Funkcja pokazująca informację w mousetip porzez podany czas
     * @param {String} text informacja do pokazania
     * @param {int} delay opóźnienie ukrycia mousetipa (milisekundy)
     */
    this.show = function (content, delay) {
        show(content);
        hide(delay);
    };

    /**
     * Funkcja dowiązującas mousetip do mouseover/mouseout obiektu DOM
     * @param {String} text informacja do pokazania
     * @param {Object} object obiekt DOM (ew. jQuery)
     */
    this.bind = function (content, object) {
        jQuery(object).mouseover(
            function () {
                show(content);
            });

        jQuery(object).mouseout(
            function () {
                hide();
            });
    };

    // dowiązanie wywołania metody inicjalizującej mechanizm do zdarzenia document.ready (onload)
    jQuery(document).ready(
        function () {
            init();
        });
};

