/** * jquery.timers - timer abstractions for jquery * written by blair mitchelmore (blair dot mitchelmore at gmail dot com) * licensed under the wtfpl (http://sam.zoy.org/wtfpl/). * date: 2009/10/16 * * @author blair mitchelmore * @version 1.2 * **/ jquery.fn.extend({ everytime: function(interval, label, fn, times) { return this.each(function() { jquery.timer.add(this, interval, label, fn, times); }); }, onetime: function(interval, label, fn) { return this.each(function() { jquery.timer.add(this, interval, label, fn, 1); }); }, stoptime: function(label, fn) { return this.each(function() { jquery.timer.remove(this, label, fn); }); } }); jquery.extend({ timer: { global: [], guid: 1, datakey: "jquery.timer", regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/, powers: { // yeah this is major overkill... 'ms': 1, 'cs': 10, 'ds': 100, 's': 1000, 'das': 10000, 'hs': 100000, 'ks': 1000000 }, timeparse: function(value) { if (value == undefined || value == null) return null; var result = this.regex.exec(jquery.trim(value.tostring())); if (result[2]) { var num = parsefloat(result[1]); var mult = this.powers[result[2]] || 1; return num * mult; } else { return value; } }, add: function(element, interval, label, fn, times) { var counter = 0; if (jquery.isfunction(label)) { if (!times) times = fn; fn = label; label = interval; } interval = jquery.timer.timeparse(interval); if (typeof interval != 'number' || isnan(interval) || interval < 0) return; if (typeof times != 'number' || isnan(times) || times < 0) times = 0; times = times || 0; var timers = jquery.data(element, this.datakey) || jquery.data(element, this.datakey, {}); if (!timers[label]) timers[label] = {}; fn.timerid = fn.timerid || this.guid++; var handler = function() { if ((++counter > times && times !== 0) || fn.call(element, counter) === false) jquery.timer.remove(element, label, fn); }; handler.timerid = fn.timerid; if (!timers[label][fn.timerid]) timers[label][fn.timerid] = window.setinterval(handler,interval); this.global.push( element ); }, remove: function(element, label, fn) { var timers = jquery.data(element, this.datakey), ret; if ( timers ) { if (!label) { for ( label in timers ) this.remove(element, label, fn); } else if ( timers[label] ) { if ( fn ) { if ( fn.timerid ) { window.clearinterval(timers[label][fn.timerid]); delete timers[label][fn.timerid]; } } else { for ( var fn in timers[label] ) { window.clearinterval(timers[label][fn]); delete timers[label][fn]; } } for ( ret in timers[label] ) break; if ( !ret ) { ret = null; delete timers[label]; } } for ( ret in timers ) break; if ( !ret ) jquery.removedata(element, this.datakey); } } } }); jquery(window).bind("unload", function() { jquery.each(jquery.timer.global, function(index, item) { jquery.timer.remove(item); }); });