(function ($) {
    var defaults = {
        callback: function () { },
        runOnLoad: true,
        frequency: 100,
        previousVisibility : null
    };

    var methods = {};
    methods.checkVisibility = function (element, options) {
        if (jQuery.contains(document, element[0])) {
            var previousVisibility = options.previousVisibility;
            var isVisible = element.is(':visible');
            options.previousVisibility = isVisible;
            if (previousVisibility == null) {
                if (options.runOnLoad) {
                    options.callback(element, isVisible);
                }
            } else if (previousVisibility !== isVisible) {
                options.callback(element, isVisible);
            }

            setTimeout(function() {
                methods.checkVisibility(element, options);
            }, options.frequency);
        } 
    };

    $.fn.visibilityChanged = function (options) {
        var settings = $.extend({}, defaults, options);
        return this.each(function () {
            methods.checkVisibility($(this), settings);
        });
    };
})(jQuery);