/**
* 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]);
            }

        }

    });

};