/**
 * Basic usage (Most common settings. {no max blinks = blink indefinitely, blinkDuration ~1 sec, no callback}):
 *
 *      $('selector').blink();
 *
 * Advanced usage:
 * 
 *      $('selector').blink({maxBlinks: 60, blinkPeriod: 1000, speed: 'slow', onMaxBlinks: function(){}, onBlink: function(){}}); 
 */

(function( $ ) {
    $.fn.blink = function( options ) {
                  
        var settings = {
            maxBlinks    : undefined,
            blinkPeriod  : 1000,
            onMaxBlinks  : function() {},
            onBlink      : function() {},
            speed        : undefined
        };

        if(options) {
            $.extend(settings, options);
        }

        var blinkElem = this;
        var on = true;
        var blinkCount = 0;
        settings.speed = settings.speed ? settings.speed : settings.blinkPeriod/2;

        toggleFade(); // Toggle first fade, then leave it to setTimeout.

        function toggleFade() {
            if(on){
                blinkElem.fadeTo(settings.speed, 0.01);
            } else {
                var maxBlinksReached = (settings.maxBlinks && (++blinkCount) >= settings.maxBlinks);
                blinkElem.fadeTo(settings.speed, 1, function() {
                    settings.onBlink.call();
                    if(maxBlinksReached) {
                        settings.onMaxBlinks.call();
                    }
                });
            }
            on = !on;

            if(!maxBlinksReached) {
                setTimeout(toggleFade, settings.blinkPeriod/2); // #3
            }
        }

        return this; // Returning 'this' to maintain chainability.
    };
})(jQuery);

