/**
 * Pulse plugin for jQuery
 * ---
 * @author James Padolsey (http://james.padolsey.com)
 * @version 0.1
 * @updated 16-DEC-09
 * ---
 * Note: In order to animate color properties, you need
 * the color plugin from here: http://plugins.jquery.com/project/color
 * ---
 * @info http://james.padolsey.com/javascript/simple-pulse-plugin-for-jquery/
 */

jQuery.fn.pulse = function( prop, speed, times, easing, callback ) {

    if ( isNaN(times) ) {
        callback = easing;
        easing = times;
        times = 1;
    }

    var optall = jQuery.speed(speed, easing, callback),
        queue = optall.queue !== false,
        largest = 0;

    for (var p in prop) {
        largest = Math.max(prop[p].length, largest);
    }

    optall.times = optall.times || times;

    return this[queue?'queue':'each'](function(){

        var counts = {},
            opt = jQuery.extend({}, optall),
            self = jQuery(this);

        pulse();

        function pulse() {

            var propsSingle = {},
                doAnimate = false;

            for (var p in prop) {

                // Make sure counter is setup for current prop
                counts[p] = counts[p] || {runs:0,cur:-1};

                // Set "cur" to reflect new position in pulse array
                if ( counts[p].cur < prop[p].length - 1 ) {
                    ++counts[p].cur;
                } else {
                    // Reset to beginning of pulse array
                    counts[p].cur = 0;
                    ++counts[p].runs;
                }

                if ( prop[p].length === largest ) {
                    doAnimate = opt.times > counts[p].runs;
                }

                propsSingle[p] = prop[p][counts[p].cur];

            }

            opt.complete = pulse;
            opt.queue = false;

            if (doAnimate) {
                self.animate(propsSingle, opt);
            } else {
                optall.complete.call(self[0]);
            }

        }

    });

};
