/**
* 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 == -1 ? true : 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]);
      }

    }

  });

};
