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